#sql #oracle
Вопрос:
В Oracle DB как я могу использовать выражение case для столбца типа number для вывода его в виде строки, если значение столбца равно определенному числу?
Например:
SELECT name,
address
CASE
WHEN my_num = 5 THEN 'some_string_one'
WHEN my_num = 10 THEN 'some_string_two'
WHEN my_num = 20 THEN 'some_string_three'
ELSE my_num
END AS my_num_in_string
FROM foo
Проблема с тем, что у меня есть выше, заключается в том, что я получаю ошибку
ORA-00932: несогласованные типы данных: ожидаемый СИМВОЛ получил НОМЕР
Мне нужен столбец, в котором числовые значения сопоставляются со строкой. Возможно ли это?
Комментарии:
1.Обратите внимание, что ваша попытка показывает
case
выражение.case
операторы тоже существуют, но только в PL/SQL, а не в SQL. Я отредактировал ваш пост, чтобы отразить это.
Ответ №1:
Различные возвращаемые значения case
выражения должны иметь совместимые типы данных.
SELECT name,
address
CASE
WHEN my_num = 5 THEN 'some_string_one'
WHEN my_num = 10 THEN 'some_string_two'
WHEN my_num = 20 THEN 'some_string_three'
ELSE to_char(my_num)
END AS my_num_in_string
FROM foo
Комментарии:
1. Я пытался
ELSE TO_CHAR(my_num)
,cast(my_num as varchar2(30))
но я не понимаю, почему это работает. Разве это не приведет к преобразованию только тех столбцов, где my_num не равен 5,10 или 20?2. Предыдущие возвращаемые значения уже являются символьными строками. Только ОСТАЛЬНОЕ должно быть преобразовано.
3. @DanteGreyson — потому что это синтаксическая ошибка, проверенная перед просмотром данных. Анализатор не знает, что единственными значениями будут 5, 10, 20. Если вы знаете, что это единственно возможные ценности, почему у вас есть
else my_num
и нетelse null
? Вы знаете, чтоelse
ветвь никогда не будет достигнута; синтаксический анализатор этого не делает. (С учетом сказанного:else null
в любом случае это значение по умолчанию, так что вы можете вообще его исключить!)4. Ошибка возникает компилятором SQL, т. е. до того, как были прочитаны какие-либо табличные данные.
5. @jarlh — просто интересно, почему
cast
, а не простоto_char()
?