Какие-либо причины, по которым я не могу заменить литерал ISNULL (col, literal) NOT LIKE на литерал col <>, если литерал не содержит подстановочных знаков? - PullRequest
0 голосов
/ 16 января 2019

Я встречал какой-то старый код, что-то вроде этого примера:

    DECLARE @tmpVal INT = 999

    DECLARE @tmpTable TABLE (col1 INT, col2 VARCHAR(20))

    INSERT INTO @tmpTable (col1, col2)
    VALUES 
        (1, 'Do not want this'),
        (2, 'Happy with this'),
        (3, NULL)

    SELECT
        col1,
        col2,
        -- I see code like this
        CASE
            WHEN ISNULL(col2, 'Do not want this') NOT LIKE 'Do not want this'
            THEN @tmpVal
        END                                                 AS CurrentCol,

        -- can I replace it with code like this because there is no else?
        CASE
            WHEN col2 <> 'Do not want this'
            THEN @tmpVal
        END                                                 AS BetterCol

    FROM 
        @tmpTable

Я думаю, что ISNULL(col2, 'Do not want this') NOT LIKE 'Do not want this' следует заменить на col2 <> 'Do not want this', поскольку он отлично справляется с нулевым регистром.

enter image description here

Могу ли я использовать форму в BetterCol вместо CurrentCol в качестве выражения WHEN, и если нет, то почему? Есть ли какие-нибудь крайние случаи, которых я не вижу?

1 Ответ

0 голосов
/ 16 января 2019

TL; DR; - Да, вы можете заменить его - это (почти) совершенно безопасно.

Более длинная версия:

В SQL Server, если не указано SET ANSI_NULL OFF (и его действительно не следует указывать никогда - обратите внимание, что оно устарело) - любое сравнение чего-либо с null приведет к UNKNOWN, что в основном эквивалентно false для case выражений или where предикатов предложения.

Это означает, что SomeValue <> NULL и SomeValue = NULL и даже NULL = NULL и NULL <> NULL все вернутся UNKNOWN

Хотя я не нашел документации о поведении NULL и оператора LIKE (я искал в SET ANSI_NULL, LIKE и NULL и UNKNOWN документация) хорошо известный факт, что поведение null такое же с оператором like, как и с оператором = - значение NULL LIKE 'some string' вернет UNKNOWN а также.

...