Где синтаксическая ошибка в этом запросе TSQL? - PullRequest
0 голосов
/ 18 ноября 2011

Следующий TQL-запрос генерируется из инструмента, который я использую, но при его выполнении возникает синтаксическая ошибка рядом с «LIKE».Я не могу понять, в чем проблема.Кто-нибудь знает, что не так?

Ошибка в SQL Management Studio: «Сообщение 156, Уровень 15, Состояние 1, Строка 17 Неверный синтаксис рядом с ключевым словом« LIKE ».»

SELECT COUNT_BIG(*)
FROM [HistoryReport] AS t0
WHERE (1 <> 0 AND 


    (CASE WHEN (
                (CASE WHEN (t0.[CategoryValue] IS NULL) 
                    THEN NULL 
                    ELSE LOWER(t0.[CategoryValue]) 
                END) IS NULL
        ) 
        THEN NULL 
        ELSE (
            (CASE WHEN (t0.[CategoryValue] IS NULL) 
                THEN NULL 
                ELSE LOWER(t0.[CategoryValue]) 
            END) LIKE 'U' + '%'     
        )
    END) <> 0) 

1 Ответ

0 голосов
/ 18 ноября 2011

Несколько вещей. Кажется очень странным, что вы проверяете, имеет ли значение значение NULL, и возвращаете NULL, если оно есть, и значение, если это не так. Затем вы снова проверяете наличие нулей в ветви кода, которая выполняется, только если значение определенно не равно нулю. Немного ненужный и очень запутанный. Кроме того, я подозреваю, что ваше сравнение с NULL не будет работать так, как вы думаете, так как NULL <> 0 по умолчанию оценивается как NULL.

Как отступление: обычно в SQL SERVER строки не чувствительны к регистру (если вы не настраиваете столбец или сервер с сортировкой с учетом регистра, что несколько редко).

Я очень стараюсь понять, что вы на самом деле имеете в виду, вот синтаксически правильная версия того, что, я думаю, вы пытаетесь сделать:

SELECT COUNT_BIG(*)
FROM [HistoryReport] AS t0
WHERE (1 <> 0 AND LOWER(t0.categoryValue) like 'U' + '%')

В основном ваш запрос гласит, что если t0.categoryValue равно null, верните null, в противном случае t0.categoryvalue преобразуйте в нижний регистр и сравните, используя like, в 'U%' и верните true, если сравнение LIKE возвращает истину. Запрос выше выполняет то же самое.

Если вы не используете сортировку с учетом регистра, вы можете удалить LOWER (), поскольку это только увеличивает стоимость и предотвращает любое использование индекса.

Теперь в мире SQL Server NULL означает «неизвестно», поэтому вопрос «Имеет ли это неизвестное значение = 0» может дать только ответ «Я не знаю». Это сбивает с толку многих людей, потому что они ожидают «NULL == NULL», который работает в некоторых языках, но в SQL Sever вы в основном спрашиваете «Является ли это неизвестное значение таким же, как это другое неизвестное значение», и ответ, опять же, неизвестно.

Так что, я думаю, мой единственный дополнительный вопрос: как сделать так, чтобы нули обрабатывались?

Также, что касается вашего исходного вопроса, может показаться, что выражения, подобные вашему LIKE 'U' + '%', не любят находиться в середине CASE утверждений.

BOL утверждает, что синтаксис:

Simple CASE expression: 
CASE input_expression 
     WHEN when_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END 
Searched CASE expression:
CASE
     WHEN Boolean_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END

и это:

THEN result_expression Возвращается ли выражение, когда input_expression равно, когда выражение_expression оценивается как TRUE, или Boolean_expression оценивается как TRUE. выражение результата любое допустимое выражение.

И то, что у вас есть с LIKE, похоже, должно быть правильным выражением, но кажется, что LIKE находится на грани действительных операторов.

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