Это нормально работает.
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: отсутствует ключевое слово


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