Привет, ребята, я здесь новичок, так что надеюсь, что все сделаю правильно, прошу прощения, если не сделаю.
В любом случае я пытаюсь понять этот оператор isNull
в SQL. Я полностью понимаю тот факт, что isnull
проверяет, является ли поле в первом аргументе значением Null
, а затем заменяет этот Null
вторым значением.
Однако что здесь означает знак равенства вне оператора ISNULL
(= 'Y'
)?
Я не понимаю, как этот знак равенства применим к тому, что я уже знаю о ISNULL()
. Между прочим, это заявление isNull
было в заявлении FROM
, а точнее, JOIN
. Приветствуется любая помощь или понимание. Синтаксис ISNULL()
ниже. Заранее спасибо!
isNull(t.fieldname,'N') = 'Y'
Я как бы узнал или усвоил эту концепцию сегодня с вашей помощью. Однако я согласен, заявление, похоже, идет окольным путем к достижению чего-то столь простого. Увидев это, я подумал, что есть какое-то понимание ISNULL и знака равенства, что я просто не могу бить себя по голове. Однако я не писал код, а просто редактировал его. Спасибо за вашу помощь!
Это эквивалентно:
(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'
Большое спасибо! Я размышлял о том, что это было что-то в этом роде, но вы попали прямо в голову. Цените помощь.
Это эквивалент нет. Первая форма является SARGable, а ISNULL(fieldName,'N') = 'Y'
- нет.
Эквивалентное выражение - 'Y' = CASE WHEN t.FieldName is NULL THEN 'N' ELSE t.Fieldname END
, оно так же уродливо, как и выглядит.
Незначительная придирка - даже выражение CASE
не эквивалентно обязательно, если тип FieldName
имеет более низкий приоритет, чем типы (n)(var)char
, поскольку ISNULL
будет преобразовывать вниз, а не вверх. Например. если FieldName
- это varbinary(5)
, то 'N'
также должен быть приведен к таковому в выражении CASE
. Потому что ISNULL
не следует обычным правилам приоритета.
ISNULL - это функция, которая просто заменяет значения NULL указанным значением, в противном случае возвращает исходное значение.
В вашем случае isNull(t.fieldname,'N')
возвращается с N
, если t.fieldname is null
для примеров вы можете проверить эту страницу: https://www.w3schools.com/sql/sql_isnull.asp
Здесь обсуждается несколько похожий случай. IsNull с равным ¿Что это означает?
Я надеюсь, что это может вам помочь.
Да, я уже проверял эту ветку. Однако я не нашел ясных объяснений, относящихся к моей проблеме.
Да, у этого человека было больше проблем с пониманием того, как знак равенства работает в операторе WHERE, чем с фактическим оператором ISNULL ().
Да ладно. Возможно, я неправильно понял вопрос (-:
Прежде всего, это идея плохой. Применение функции к полю не позволяет серверу использовать индексы.
ISNULL()
вернет первый ненулевой аргумент. Это выражение заменитNULL
наN
, но затем сравнит его сY
. Эквивалент будетt.FieldName = 'Y'
, даст результат тем же и не повредит производительности.