Isnull с equal внутри оператора from / join "isnull (t.fieldname, 'n') = 'y'"

Привет, ребята, я здесь новичок, так что надеюсь, что все сделаю правильно, прошу прощения, если не сделаю.

В любом случае я пытаюсь понять этот оператор isNull в SQL. Я полностью понимаю тот факт, что isnull проверяет, является ли поле в первом аргументе значением Null, а затем заменяет этот Null вторым значением.

Однако что здесь означает знак равенства вне оператора ISNULL (= 'Y')?

Я не понимаю, как этот знак равенства применим к тому, что я уже знаю о ISNULL(). Между прочим, это заявление isNull было в заявлении FROM, а точнее, JOIN. Приветствуется любая помощь или понимание. Синтаксис ISNULL() ниже. Заранее спасибо!

isNull(t.fieldname,'N') = 'Y'

Прежде всего, это идея плохой. Применение функции к полю не позволяет серверу использовать индексы. ISNULL() вернет первый ненулевой аргумент. Это выражение заменит NULL на N, но затем сравнит его с Y. Эквивалент будет t.FieldName = 'Y', даст результат тем же и не повредит производительности.

Panagiotis Kanavos 31.10.2018 13:40

Я как бы узнал или усвоил эту концепцию сегодня с вашей помощью. Однако я согласен, заявление, похоже, идет окольным путем к достижению чего-то столь простого. Увидев это, я подумал, что есть какое-то понимание ISNULL и знака равенства, что я просто не могу бить себя по голове. Однако я не писал код, а просто редактировал его. Спасибо за вашу помощь!

Jamen Alexander 31.10.2018 14:28
1
2
93
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это эквивалентно:

(t.fieldname IS NOT NULL AND t.fieldname = 'Y') 

Однако это также упростило бы это:

t.fieldname = 'Y'

Это отфильтрует только записи с fieldname = 'Y'. Это предполагает, что части взяты из предложения WHERE, если это не может быть для JOIN с предложением ON, вы можете вместо этого написать простое выражение case:

ON (CASE WHEN t.FieldName IS NULL THEN 'N' ELSE t.Fieldname END) = 'Y'

Большое спасибо! Я размышлял о том, что это было что-то в этом роде, но вы попали прямо в голову. Цените помощь.

Jamen Alexander 31.10.2018 13:41

Это эквивалент нет. Первая форма является SARGable, а ISNULL(fieldName,'N') = 'Y' - нет.

Panagiotis Kanavos 31.10.2018 13:41

Эквивалентное выражение - 'Y' = CASE WHEN t.FieldName is NULL THEN 'N' ELSE t.Fieldname END, оно так же уродливо, как и выглядит.

Panagiotis Kanavos 31.10.2018 13:42

Незначительная придирка - даже выражение CASE не эквивалентно обязательно, если тип FieldName имеет более низкий приоритет, чем типы (n)(var)char, поскольку ISNULL будет преобразовывать вниз, а не вверх. Например. если FieldName - это varbinary(5), то 'N' также должен быть приведен к таковому в выражении CASE. Потому что ISNULL не следует обычным правилам приоритета.

Damien_The_Unbeliever 31.10.2018 14:30

ISNULL - это функция, которая просто заменяет значения NULL указанным значением, в противном случае возвращает исходное значение.

В вашем случае isNull(t.fieldname,'N') возвращается с N, если t.fieldname is null

для примеров вы можете проверить эту страницу: https://www.w3schools.com/sql/sql_isnull.asp

Здесь обсуждается несколько похожий случай. IsNull с равным ¿Что это означает?

Я надеюсь, что это может вам помочь.

Да, я уже проверял эту ветку. Однако я не нашел ясных объяснений, относящихся к моей проблеме.

Jamen Alexander 31.10.2018 14:17

Да, у этого человека было больше проблем с пониманием того, как знак равенства работает в операторе WHERE, чем с фактическим оператором ISNULL ().

Jamen Alexander 31.10.2018 15:32

Да ладно. Возможно, я неправильно понял вопрос (-:

desa 02.11.2018 08:27

Другие вопросы по теме