TSQL — Значения регистра в?

#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 [] идентификаторы предназначены для заключения символов в кавычки, таких как имена столбцов — в именах столбцов могут быть пробелы и всевозможные нечетные символы, если вы действительно этого хотите. Используйте '' кавычки для заключения строковых литералов в кавычки.