Несколько вещей. Кажется очень странным, что вы проверяете, имеет ли значение значение 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
находится на грани действительных операторов.