Предложение SQL WHERE не возвращает строки, когда поле имеет значение NULL - PullRequest
1 голос
/ 15 января 2011

Хорошо, поэтому я знаю об этой проблеме:

Когда параметр SET ANSI_NULLS включен, все сравнения с нулевым значением оцениваются как UNKNOWN

ОднакоЯ пытаюсь запросить DataTable.

Я мог бы добавить к своему запросу:

OR col_1 IS NULL OR col_2 IS NULL

для каждого столбца, но в моей таблице 47 столбцов, и я строю динамическиSQL (конкатенация строк), и это кажется болезненным для этого.Есть ли другое решение?

Я должен был вернуть все строки, которые имеют значения NULL в сравнении WHERE.

ОБНОВЛЕНИЕ

Пример запроса, который вызвал у меня проблемы:

string query = col_1 not in ('Dorothy', 'Blanche') and col_2 not in ('Zborna', 'Devereaux')
grid.DataContext = dataTable.Select(query).CopyToDataTable();

(не удалось получить строки, если / когда col_1 = null и / или col_2 = null)

Ответы [ 2 ]

5 голосов
/ 15 января 2011

То есть вы имеете в виду что-то вроде (пример с 2 столбцами)

WHERE (col1 = 'abc' or col1 is null)
  AND (col2 = 3 or col2 is null)

Но вы хотите всегда включать нули?Это должно работать

WHERE isnull(col1,'abc') = 'abc'
  AND isnull(col2, 3) = 3
3 голосов
/ 15 января 2011

Вы делаете это, потому что хотите получить значения NULL или потому, что вы не хотите, чтобы значения NULL мешали вашим сравнениям?

Например, это:

WHERE col_1 != 'John'

не вернет ни одной строки, для которой col_1 равно NULL (вы указали в своем вопросе, что знаете это).

Если вы пытаетесь получить строки col_1 IS NULL для возврата с предложением WHEREКак и выше, у вас есть два варианта в MS SQL (один в mySql).

В MS SQL и mySql функция coalesce() позволит вам выполнить сравнение такого рода.В MS SQL (я полагаю, что то же самое для mySql), его функция состоит в том, чтобы принимать два или более аргумента и оценивать их по порядку, возвращая первый ненулевой, который он находит.В MS SQL есть сокращенная функция с именем isNull(), которая похожа на coalesce(), но принимает только два параметра.

В приведенном выше примере вы должны сделать следующее:

WHERE coalesce(col_1,'') != 'John'

и это вернет строки с col_1 IS NULL, а также строки с ненулевыми значениями в col_1, которые не равны 'John'.

Если это ваша реальная цель, тогда этот метод должен работатьдля тебя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...