Использование выражения case для столбца типа number для вывода его в виде строки

#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() ?