SQL: выражение CASE с объявленной переменной - PullRequest
0 голосов
/ 13 июля 2020

У меня есть следующий пример, который не работает на сервере SQL. table1.field1 также является char (3)

DECLARE @CALCULATED_FIELD char(3);

SELECT table1.field1
       ,table1.field2
       ,CASE 
            WHEN table1.field2 = '1' THEN @CALCULATED_FIELD = table1.field1
            ELSE @CALCULATED_FIELD = 'ALL'
       END
FROM table1

Кто-нибудь знает проблему с оператором case?

Ответы [ 5 ]

1 голос
/ 13 июля 2020
Оператор

A SQL Server SELECT может либо назначать значения переменных, либо возвращать строки, но не то и другое вместе. Вы можете указать:

SELECT @CALCULATED_FIELD = COALESCE(table1.field1, 'ALL')
FROM table1;

Это позволит присвоить переменной максимальное значение - и единственное значение, если таблица имеет только одну строку. Если в таблице нет строк, переменной будет присвоено 'ALL'.

0 голосов
/ 14 июля 2020

Спасибо большое. На функцию создания у меня нет прав, и мы не можем делать это в производственной среде. Но сработает. Отлично.

Используется пример из forpas, и он отлично подходит для меня.

0 голосов
/ 13 июля 2020

Выражения вроде A=B не являются скалярным значением. Поэтому, когда вы запускаете следующий запрос, он не работает, и вы получите сообщение об ошибке Incorrect syntax near '='.

SELECT ('aaa' = 'aaa')

В вашем случае

CASE WHEN table1.field2 = '1'
THEN @CALCULATED_FIELD = table1.field1
ELSE @CALCULATED_FIELD = 'ALL'
END

не является допустимым выражением, и вы можете означает что-то вроде

CASE WHEN table1.field2 = '1'
THEN (CASE WHEN @CALCULATED_FIELD = table1.field1 THEN 1 ELSE 0)
ELSE (CASE WHEN @CALCULATED_FIELD = 'ALL' THEN 1 ELSE 0)
END

Обратите внимание, что вы можете запустить запрос типа

SELECT columnName = 'aaa'

, и он работает как

SELECT 'aaa' AS columnName
0 голосов
/ 13 июля 2020

Я бы использовал функцию масштабирования в этом случае

CREATE FUNCTION calcfield
  (
   @field2 VARCHAR(4),
   @field1 VARCHAR(4)
   )  
  RETURNS VARCHAR(3)
   AS
   BEGIN
   DECLARE @CalcField CHAR(3)
   SELECT @CalcField = CASE 
       WHEN @field2 = '1' THEN  @field1
        ELSE  'ALL'
    END 
   RETURN @CalcField
  END
 GO

, а затем изменил ваш запрос на

  SELECT table1.field1
   ,table1.field2
   ,dbo.calcfield(table1.field2,table1.field1) 
  FROM table1
0 голосов
/ 13 июля 2020

Результат выражения CASE должен быть присвоен переменной, но в том же операторе не разрешено возвращать какие-либо столбцы из таблицы. Итак, это:

SELECT  
  @CALCULATED_FIELD = CASE 
    WHEN field2 = '1' THEN field1 
    ELSE 'ALL' 
  END 
FROM table1

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

Судя по имени переменной, я подозреваю, что вам нужен 3D-столбец, который будет вычислен по CASE:

SELECT field1, field2, 
  CASE 
    WHEN field2 = '1' THEN field1 
    ELSE 'ALL' 
  END calculated_field
FROM table1

См. Упрощенный демо .

...