SQL Case() приводит результаты к целому числу
Работая с базой данных Pervasive SQL, у меня есть сложный оператор SQL SELECT, который содержит следующее:
CASE l."Position"
WHEN 3 THEN "PIC"
WHEN 4 THEN "SIC"
WHEN 22 THEN "FA"
ELSE ''
END AS "Position"
l."Position"
хранится в базе данных как TINYINT. Очевидно, я пытаюсь вернуть строку - в основном конвертировать числовой код в понятную метку. Но результат в этом столбце всегда 0
потому что (по-видимому) он выводит целочисленное поле, а "PIC" (например) равен 0, когда приводится как число. Если я изменю это на...
CASE l."Position"
WHEN 3 THEN 123
WHEN 4 THEN 456
WHEN 22 THEN 789
ELSE ''
END AS "Position"
... он возвращает трехзначные числа, как и ожидалось, поэтому я знаю, что само дело работает нормально.
Как мне сказать Case() вернуть строку /varchar?
2 ответа
Исправлено ли это, если вы используете одинарные кавычки для строковых констант?
(CASE l."Position"
WHEN 3 THEN 'PIC'
WHEN 4 THEN 'SIC'
WHEN 22 THEN 'FA'
ELSE ''
END) AS "Position"
Другая возможность заключается в том, что вы должны назвать новый столбец другим именем, например, Position_Name
, Если вы выбираете в запросе саму "Позицию", то это может привести к путанице.
Пример из официальной документации, не похоже, что это вызовет проблемы
SELECT last_name, first_name, CASE WHEN scholarship = 1 THEN 'Scholastic' WHEN citizenship <> 'United States' THEN 'Foreign Study' WHEN (date_of_birth >= '1960-01-01' AND date_of_birth <= '1970-01-01') THEN 'AJ-44 Funds' ELSE 'NONE' END AS 'Funding Program' FROM Person ORDER BY last_name
В результате проблема заключается не в самом утверждении CASE, а в As Position
часть, где Position - это имя вашего столбца с типом данных TINYINT. Вы должны рассмотреть возможность использования псевдонима, который отличается от имен ваших столбцов.