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

Другие вопросы по тегам