КОЛИЧЕСТВО () Функция в сочетании с НЕ В пункте, не работающем правильно с varchar полем (T-SQL)

Я столкнулся со странной ситуацией при попытке считать количество строк, которые НЕ имеют значений varchar указанными избранным оператором. Хорошо, это звучит сбивающим с толку даже меня, таким образом позвольте мне дать Вам пример:

Скажем, у меня есть поле "MyField" в "SomeTable", и я хочу включить, сколько строк значения MyField не принадлежат домену, определенному значениями "MyOtherField" в "SomeOtherTable". Другими словами, предположите, что у меня есть MyOtherField = {1, 2, 3}, я хочу включить, сколько строк значение MyField не 1, 2 или 3. Для этого я использовал бы следующий запрос:

SELECT COUNT(*) FROM SomeTable   
WHERE ([MyField] NOT IN (SELECT MyOtherField FROM SomeOtherTable))   

И это работает как очарование. Заметьте однако, что MyField и MyOtherField являются введенным интервалом. Если я пытаюсь выполнить тот же самый запрос, за исключением введенных полей varchar, его значение возврата 0 даже при том, что я знаю, что существуют неправильные значения, я поместил их там! И если я, однако, пытаюсь считать противоположное (сколько строк НАХОДИТСЯ в домене, настроенном против того, что я хочу, именно так много строк не), просто путем подавления "НЕ" пункта в запросе выше... Ну, ЭТО работает! ¬¬

Да, должны быть тонны обходных решений к этому, но я хотел бы знать, почему это не работает способ, которым это должно. Кроме того, я не могу просто изменить целый запрос, поскольку большая часть из него создается в коде C#, и в основном единственная первая часть имеет свободу измениться, который не окажет влияние ни в какой другой части программного обеспечения, избранный оператор, который соответствует домену (независимо от того, что входит НЕ В пункте). Я надеюсь, что ясно выразился, и кто-то там мог выручить меня.

Заранее спасибо.

7
задан gbn 17 March 2010 в 05:41
поделиться

2 ответа

Для NOT IN всегда ложно, если подзапрос возвращает значение NULL. Принятый ответ на этот вопрос элегантно описывает почему.

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

Постарайтесь с этим справиться, используйте NOT EXISTS. Для ненулевых значений он работает так же, как NOT IN, поэтому совместим

SELECT COUNT(*) FROM SomeTable S1 
WHERE NOT EXISTS (SELECT * FROm SomeOtherTable S2 WHERE S1.[MyField] = S2.MyOtherField)   
6
ответ дан 7 December 2019 в 10:00
поделиться

gbn предлагает более полный ответ, но я не хочу вспоминать все это. Вместо этого у меня есть религиозная привычка фильтровать нули из моих предложений IN:

SELECT COUNT(*)
FROM SomeTable    
WHERE [MyField] NOT IN (
  SELECT MyOtherField FROM SomeOtherTable
  WHERE MyOtherField is not null
)
0
ответ дан 7 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: