2017-01-16 3 views
-1

У меня есть 6 столбцов с одинаковым значением, равным 0,1,2,3. Я хочу показать результат, такой как 0 представляет SUCCESS, 1 или 2 представляет отказ, а 3 - НЕ ПРИМЕНИМО. Так, если в БД значения являются:Выберите несколько столбцов, используя декодирование

col A | col B | col C | col D | col E | col F 
0  | 1 | 2 | 0 | 3 | 2 

Вывод должен быть:

col A | col B | col C | col D | col E | col F 
S  | F | F |  S | NA | F 

Можно ли сделать это с помощью декодирования, выбрав все столбцы сразу, а не выбирать их по отдельности?

+0

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

+1

Это возможно *, открывая таблицу, декодируя отдельные строки, которые производят, а затем поворачивается назад к исходному макету; но это почти наверняка не стоит дополнительной работы, и будет проще и понятнее просто декодировать каждый столбец отдельно. –

ответ

0

Если я правильно понимаю ваш вопрос, это звучит, как вам просто нужно выражение случая (или декодирование, если вы предпочитаете, но это менее самодокументированно, чем выражение случая), вдоль линий:

case when some_col = 0 then 'S' 
    when some_col in (1, 2) then 'F' 
    ... 
    else some_col -- replace with whatever you want the output to be if none of the above conditions are met 
end 

или, может быть:

case some_col 
    when 0 then 'S' 
    when 1 then 'F' 
    ... 
    else some_col -- replace with whatever you want the output to be if none of the above conditions are met 
end 

Таким образом, ваш запрос будет выглядеть так:

select case ... 
     end col_a, 
     ... 
     case ... 
     end col_f 
from your_table; 
0

Возможно ли это сделать путем декодирования, выбирая сразу все столбцы, а не выбрав их отдельно?
Нет

Однако, помимо использования пивот, единственное решение, которое я вижу бы использовать PL/SQL:

1.Это как я моделируется таблицу

SELECT * 
FROM (WITH tb1 (col_a, col_b, col_c, col_d, col_e, col_f) AS 
(SELECT 0, 1, 2, 0, 3, 2 FROM DUAL) 
    SELECT * 
     FROM tb1) 

2.I добавили бы колонки вместе с запятой между ними и сохранили бы их в таблице строк

SELECT col_a || ',' || col_b || ',' || col_c || ',' || col_d || '.' || col_e || ',' || col_f 
FROM (WITH tb1 (col_a, col_b, col_c, col_d, col_e, col_f) AS (SELECT 0, 1, 2, 0, 3, 2 FROM DUAL) 
    SELECT * 
     FROM tb1) 

3.Then Я хотел бы использовать REGEXP_REPLACE заменить ваши значения на одну строку в то время

SELECT REPLACE (REGEXP_REPLACE (REPLACE ('0,1,2,0,3,2', 0, 'S'), '[1-2]', 'F'), 3, 'NA') COL_STR 
FROM DUAL 

4. Использование динамического SQL Я хотел бы обновить таблицу, используя ROWID или что вы собираетесь делать. Я сделал это SQL, который будет разделять строку на столбцы

SELECT REGEXP_SUBSTR (COL_STR, '[^,]+', 1, 1) AS COL_A, 
     REGEXP_SUBSTR (COL_STR, '[^,]+', 1, 2) AS COL_B, 
     REGEXP_SUBSTR (COL_STR, '[^,]+', 1, 3) AS COL_C, 
     REGEXP_SUBSTR (COL_STR, '[^,]+', 1, 4) AS COL_D, 
     REGEXP_SUBSTR (COL_STR, '[^,]+', 1, 5) AS COL_E, 
     REGEXP_SUBSTR (COL_STR, '[^,]+', 1, 6) AS COL_F 
FROM tst1) 

Все это очень утомительно, и это может занять некоторое время. Использование DECODE или CASE было бы проще в том, чтобы смотреть и интерпретировать и, следовательно, легче поддерживать.

Смежные вопросы