2013-07-05 1 views
0

Как найти строки, чей столбец даты имеет значение null, не используя 'is null' в запросе?Без использования 'isnull' и найти строки, которые имеют нуль в определенном столбце

SELECT * FROM HR_OPERATING_UNITS WHERE date_to IS NULL; 

В вышеприведенном запросе я хочу использовать переменную привязки, которая может иметь нуль в ней. Таким образом, ожидается запрос:

SELECT * FROM HR_OPERATING_UNITS WHERE date_to=:P_TO_DATE; 

Но приведенное выше утверждение не получать какие-либо строки через, хотя есть нуль в этой переменной связывания.

+4

Во-первых: пожалуйста, НЕ ПИШИТЕ ВСЕ В ВЕРХНЕЙ ЧАСТИ - это действительно очень трудно читать, это считается ** ОБУВЬ ** у людей, и это грубо. Во-вторых: для какой системы баз данных *** это? SQL - это всего лишь язык запросов - используется многими базами данных ..... это MySQL? Postgres? IBM DB2? Oracle? SQL Server? Firebird? Interbase? что-то еще совсем? –

ответ

3

Стандартный подход для обработки переменная является нуль отдельно:

SELECT * FROM HR_OPERATING_UNITS 
WHERE date_to=:P_TO_DATE 
OR (:P_TO_DATE IS NULL AND date_to IS NULL) 

Если вы действительно должны иметь только одну ссылку на переменную:

SELECT * FROM HR_OPERATING_UNITS 
WHERE COALESCE(date_to, '1900-01-01') = COALESCE(:P_TO_DATE, '1900-01-01') 

Комплектование значение, которое никогда не будет отображаться в столбец date_to в качестве значения фиктивного значения.

+0

** Большое спасибо ** – user2042156

0

, если значение равно нулю дата использования мин значения:

ISNULL(date_to,cast('1753-1-1' as datetime)) = ISNULL(:P_TO_DATE,cast('1753-1-1' as datetime)) 

это для SQL-сервера, возможно, придется заменить ISNULL с NVL

1

Если я понял ваш вопрос, который вы хотите фильтровать всякий раз, когда или связывать переменная имеет значение null или нет. Если да, то попробуйте следующее:

SELECT * FROM HR_OPERATING_UNITS WHERE (:P_TO_DATE IS NULL AND date_to IS NULL) OR (date_to=:P_TO_DATE); 
1

Вы можете сделать это с помощью coalesce():

SELECT * 
FROM HR_OPERATING_UNITS 
WHERE coalesce(date_to, '2000-01-01') = coalesce(:P_TO_DATE, '2000-01-01') 

Это предполагает, что '2000-01-01' не является допустимым значением даты в date_to.

Если оба значения равны NULL, сравнение по дате по умолчанию является истинным. Если ни один из них не равен NULL, сравнение будет столбцом к значению. Если один из 'NULL', то сравнение относится к значению по умолчанию, которое является ложным.

+0

будет использовать 'coalesce' на' date_to', потому что индекс на 'date_to' не будет использоваться? – iruvar

+0

@ 1_CR. , , В большинстве баз данных «да». «Правильное» решение - это предложение, предложенное богемским, но OP явно заявляет, что он/она не хочет использовать 'is null '. –

Смежные вопросы