Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2011, 19:35   #1
lyle_200490
Пользователь
 
Регистрация: 19.11.2010
Сообщений: 21
По умолчанию SQL запрос. Не выводит строки, где в одном поле присутствует NULL, хотя идет проверка

Работа ведется с MySQL
Есть 3 таблицы

Абоненты и их тарифы - Callerlist
с полями
CallerID AutoInc
CallerFIO ФИО (обязательное поле)
CallerTarPhID Тариф телефона (обязательное поле)
CallerTarIntID Тариф интернета (НЕобязательное поле) по умолчанию хранится NULL

Заполнение
1 Иванов ИИ 1 1
2 Сидоров СС 2 2
3 Петров ПП 3 NULL

Тарифы телефона - TPList
TPID AutoInc
TPName Название (обязательное поле)

Заполнение
1 Повременный
2 Социальный
3 Безлимитный

Тарифы интернета - TIList
TIID AutoInc
TIName Название (обязательное поле)

Заполнение
1 Безлимитный
2 Планета

Сделать запрос так, чтобы вывел
Иванов ИИ Повременный Безлимитный
Сидоров СС Социальный Планета
Петров ПП Безлимитный (пустое поле)

Вся проблема с когда CallerTarIntID=NULL

SELECT CallerFIO, TPName, TIName
FROM callerlist, tplist, tilist
WHERE CallerTarPh = TPID AND (CallerTarInt = NULL OR CallerTarInt = TIID)

Не выводит, когда у человека нет интернета. Выводит только тех у кого есть, а мне надо всех.
lyle_200490 вне форума Ответить с цитированием
Старый 07.04.2011, 20:14   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ЗАПОМНИТЕ. НА БУДУЩЕЕ.
Понять это НЕЛЬЗЯ. Это надо ТОЛЬКО ЗАПОМНИТЬ!
Значение NULL НЕ РАВНЯЕТСЯ значению NULL и, одновременно, оно НЕ НЕ РАВНЯЕТСЯ!
т.е. если есть строчка где в поле CallerTarInt стоит NULL - то и запрос
select * from callerlist CallerTarInt = NULL
не вернёт эту запись,
ни запрос
select * from callerlist CallerTarInt <> NULL
не вернёт!

ЕДИНСТВЕННЫЙ правильный способ выбрать запись с NULL это:
Код:
select * from callerlist CallerTarInt is NULL
(ну, или грамотное использование функции COALESCE() может помочь.. )
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.04.2011, 20:47   #3
lyle_200490
Пользователь
 
Регистрация: 19.11.2010
Сообщений: 21
По умолчанию

Я начинающий. Помогите финальный запрос, чтоб вывел когда выводит и с Null и не с Null
как в результате должно получится.
lyle_200490 вне форума Ответить с цитированием
Старый 07.04.2011, 20:58   #4
lyle_200490
Пользователь
 
Регистрация: 19.11.2010
Сообщений: 21
По умолчанию

Функция COALESCE() как я понял объединяет столбцы. А мне нужно объединть строки с Null и без него - то есть в столбце ТарифИнтернетаНазвание
lyle_200490 вне форума Ответить с цитированием
Старый 07.04.2011, 21:23   #5
Asinkrit
Пользователь
 
Аватар для Asinkrit
 
Регистрация: 02.04.2011
Сообщений: 48
По умолчанию

Не знаю как мускуль, а на других бд такой вариант прокатывал
Код:
SELECT CallerFIO, TPName, TIName
FROM callerlist, tplist, tilist
WHERE CallerTarPh = TPID AND CallerTarInt =* TIID
Asinkrit вне форума Ответить с цитированием
Старый 07.04.2011, 21:30   #6
lyle_200490
Пользователь
 
Регистрация: 19.11.2010
Сообщений: 21
По умолчанию

Не идет, ругается на синтаксис
lyle_200490 вне форума Ответить с цитированием
Старый 07.04.2011, 22:14   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот, попробуйте
вариант 1
Код:
SELECT CallerFIO, TPList.TPName, Coalesce(tilist.TIName,'нет') as TarifName 
FROM tplist, callerlist left join tilist 
  on callerlist.CallerTarIntID = tilist.TIID 
WHERE callerlist.CallerTarPhID  = tplist.TPID
вариант 2
Код:
SELECT CallerFIO, TPList.TPName, tilist.TIName as TarifName 
FROM tplist, callerlist, tilist 
WHERE callerlist.CallerTarPhID  = tplist.TPID
and   callerlist.CallerTarIntID = tilist.TIID 
UNION ALL
SELECT CallerFIO, TPList.TPName, 'нет интернета вааще' as TarifName 
FROM callerlist, tplist
WHERE callerlist.CallerTarPhID  = tplist.TPID
and   callerlist.CallerTarIntID is null
достаточно?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.04.2011, 22:41   #8
lyle_200490
Пользователь
 
Регистрация: 19.11.2010
Сообщений: 21
По умолчанию

Да, спасибо большое!
Разобрался.
lyle_200490 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
NULL в sql-запросах _SERGEYX_ БД в Delphi 5 27.10.2010 18:16
запрос с is null Ks2010 БД в Delphi 14 22.07.2010 21:50
Картинка и текст в одном поле таблицы _SERGEYX_ БД в Delphi 0 23.01.2010 16:19
Выводит ошибку "Unclarified identifier", хотя недавно запускалась в другой программе Alex Cones Общие вопросы Delphi 2 20.04.2009 21:31
если поле Patr пусто или null то пустую строку возвращает azat БД в Delphi 5 01.02.2008 13:05