SQL Case () приводит результаты к целому числу - PullRequest
0 голосов
/ 18 января 2019

Работая с базой данных 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 ]

0 голосов
/ 18 января 2019

Пример из официальной документации , не похоже, что это вызовет проблему

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

0 голосов
/ 18 января 2019

Исправлено ли это, если вы используете одинарные кавычки для строковых констант повсюду?

(CASE l."Position"
     WHEN 3 THEN 'PIC'
     WHEN 4 THEN 'SIC'
     WHEN 22 THEN 'FA'
     ELSE ''
 END) AS "Position"

Другая возможность заключается в том, что вы должны назвать новый столбец другим именем, например Position_Name. Если вы выбираете саму «Позицию» в запросе, то они могут запутаться.

...