Как выполнить блок операторов в then и else в Oracle sql

Это нормально работает.

SELECT (CASE WHEN condition then s1 else s2 end) from table.

но я ищу решение для выполнения нескольких операторов, таких как

SELECT (CASE WHEN condition then s1, s2, s3.. else s4, s5,s6 end) from table.

Есть ли способ выполнить блок запросов в блоке then and else или любую альтернативу сделать то же самое?

Что-то вроде этого.

select (case when (LENGTH(TRIM(TRANSLATE(substr(var, -2), ' +-.0123456789', ' '))) is NULL) then RTRIM(SUBSTR(var, -2)) as A, LTRIM(SUBSTR(var, 1, (LENGTH(var) - 3))) as B else RTRIM(SUBSTR(var, -4)) as A, LTRIM(SUBSTR(var, 1, (LENGTH(var) - 3))) as B end) from trade

В настоящее время я получаю

Ошибка (я), предупреждение (я):

ORA-00905: отсутствует ключевое слово

Помогите нам понять, что вы пытаетесь сделать, опубликовав некоторые образцы данных и желаемый результат, полученный из этого образца. Не ждите, что мы перепроектируем вашу бизнес-логику на основе какого-то шороховатого кода.

APC 24.03.2018 16:20
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
33
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Одно выражение не может создавать несколько столбцов. Вместо этого вы можете использовать объединение альтернатив:

with tab as ( 
  select 1 as choice, var, RTRIM(SUBSTR(var, -2)) as A
        , LTRIM(SUBSTR(var, 1, (LENGTH(var) - 3))) as B 
  from table
  union all
  select 2 as choice, var, RTRIM(SUBSTR(var, -4)) as A
        , LTRIM(SUBSTR(var, 1, (LENGTH(var) - 3))) as B 
  from table
)
select tab.A, tab.B 
from tab 
where tab.choice = case when (LENGTH(TRIM(TRANSLATE(substr(tab.var, -2)
                                    , ' +-.0123456789', ' ')))  is NULL) 
                                then 1 
                                else 2 end
-- not tested
;
Ответ принят как подходящий

Вы не можете делать то, что хотите, так, как хотите.

Я бы поместил условие в подзапрос, а затем использовал бы повторяющиеся выражения case:

select (case when is_numeric = 1 
             then rtrim(substr(var, -2))
             else rtrim(substr(var, -4)) as A,
        end) as a,
       (case when is_numeric = 1
             then ltrim(substr(var, 1, length(var) - 3))
             else ltrim(substr(var, 1, length(var) - 3))
        end) as B
from (select t.*,
             (case when LENGTH(TRIM(TRANSLATE(substr(var, -2), ' +-.0123456789', ' '))) is NULL
                   then 1 else 0
              end) as is_numeric
      from trade t
     ) t

Если я не ошибаюсь, B имеет такое же определение, поэтому вы можете упростить это до:

select (case when is_numeric = 1 
             then rtrim(substr(var, -2))
             else rtrim(substr(var, -4)) as A,
        end) as a,
       ltrim(substr(var, 1, length(var) - 3)) as B
from (select t.*,
             (case when LENGTH(TRIM(TRANSLATE(substr(var, -2), ' +-.0123456789', ' '))) is NULL
                   then 1 else 0
              end) as is_numeric
      from trade t
     ) t

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