使用解码选择多个列

时间:2017-01-16 10:52:51

标签: oracle11g

我有6列,其值与0,1,2,3相同。我想显示结果,如0表示SUCCESS,1或2表示失败,3表示不适用。因此,如果在DB中,值为:

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  

是否可以通过一次选择所有列而不是单独选择它来通过解码来实现?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

是否可以通过一次选择所有列而不是单独选择它来通过解码来实现?

然而,除了使用pivot之外,我看到的唯一解决方案是使用PL / SQL:

这就是我模拟你的桌子的方式

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.我会将列与它们之间用逗号追加并将它们保存到字符串表中

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.然后我会使用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)

所有这些都非常乏味,可能需要一些时间。使用DECODECASE会更容易查看和解释,从而更容易维护。