#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
Есть ли способ, которым мы можем указать значения в для инструкции case? Приведенный ниже оператор не выполняется, потому что он считает, что 53,57,82,83 и т.д. Являются столбцами.. Есть ли обходной путь.. я погуглил, но не нашел ничего, что говорило бы о том, что вы не можете использовать выражение IN case-when..
select
x =
case
when xvalue in ([52],[57],[82],[83])
then "xvalue"
when yvalue in ([01],[02],[11])
then "yvalue"
else
'NULL'
end
from xyztable
Комментарии:
1. Для какой версии SQL Server, или это для Sybase?
2. Причина, по которой я использовал скобки, заключается в том, что .. при использовании того же В в сводных таблицах.. MSDN сообщает мне об использовании следующим образом.. ВЫБЕРИТЕ ‘AverageCost’ В КАЧЕСТВЕ Cost_Sorted_By_Production_Days, [0], [1], [2], [3], [4] ИЗ (ВЫБЕРИТЕ DaysToManufacture, StandardCost ИЗ Production. Product) В качестве исходной СВОДНОЙ (средняя (стандартная стоимость) ДЛЯ DaysToManufacture В ([0], [1], [2], [3], [4]) ) КАК сводная таблица;
3. Это немного устарело, но … вы используете скобки в сводной таблице, потому что вы эффективно сглаживаете столбцы с помощью инструкции IN
Ответ №1:
Не заключайте числа в квадратные скобки.
Комментарии:
1. Голосование за старейшего в качестве ответа 🙂
Ответ №2:
Использовать:
SELECT x = CASE
WHEN t.xvalue IN (52, 57, 82, 83) THEN 'xvalue'
WHEN t.yvalue IN (01, 02, 11) THEN 'yvalue'
ELSE NULL
END
FROM TABLE t
Предполагая, что вам нужно значение из столбца, используйте:
SELECT x = CASE
WHEN t.xvalue IN (52, 57, 82, 83) THEN t.xvalue
WHEN t.yvalue IN (01, 02, 11) THEN t.yvalue
ELSE NULL
END
FROM TABLE t
Вы понимаете, что если в группах есть как xvalue, так и yvalue, будет отображаться только xvalue?
Ответ №3:
Попробуйте это:
select
case
when xvalue in (52,57,82,83)
then "xvalue"
when yvalue in (01,02,11)
then "yvalue"
else
'NULL'
end as 'x'
Если вы хотите использовать x, который, как я предполагаю, будет переменной, вы захотите определить его следующим образом:
ОБЪЯВИТЬ @x int
select
@x = case
when xvalue in (52,57,82,83)
then "xvalue"
when yvalue in (01,02,11)
then "yvalue"
else
'NULL'
end
Комментарии:
1. @Random:
X=
совпадает с ` as x`2. @Gabriel, нет, если вы хотите использовать его позже внутри t-sql …
x=
иas x
просто назовут соответствующий столбец с этим именем, в то время как объявление переменной позволяет получить к ней прямой доступ из того же блока t-sql…3. Это то, что я сказал.
x =
и `как x` оба выполняют одно и то же. Я только указал, что не было никаких оснований полагать, что OP хотел использовать переменную. Мне кажется, что poster хочет использовать только псевдоним — иx =
в этом случае он совпадает с ` as x`.
Ответ №4:
Причина, по которой ваш запрос не работает, заключается в том, что он написан неправильно. Посмотрите на это:
in ([01],[02],[11])
Добавление [] вокруг ваших значений означает, что вы хотите, чтобы они обрабатывались как имена столбцов. Если вы удалите кавычки, то эта часть будет работать. Также посмотрите на это:
then "xvalue"
здесь нужны одинарные кавычки.
else 'NULL'
Здесь вы хотите, чтобы значение было NULL или строка «NULL»? В том виде, в каком вы это написали, это будет строка «NULL»
Чтобы придать ему нулевое значение, запишите его следующим образом:
else NULL
Вот опять все это, написано правильно:
select
x =
case
when xvalue in (52,57,82,83)
then 'xvalue'
when yvalue in (01,02,11)
then 'yvalue'
else 'NULL'
end
from xyztable
Ответ №5:
Конечно, если xvalue является числовым столбцом, просто снимите скобки. Тогда все должно работать нормально. Скобки сообщают серверу базы данных, что что-то является объектом базы данных, поэтому удалите их, чтобы они обрабатывались как литерал.
Ответ №6:
В t-sql []
идентификаторы предназначены для заключения символов в кавычки, таких как имена столбцов — в именах столбцов могут быть пробелы и всевозможные нечетные символы, если вы действительно этого хотите. Используйте ''
кавычки для заключения строковых литералов в кавычки.