Oracle11g 使用decode选择多个列

Oracle11g 使用decode选择多个列,oracle11g,Oracle11g,我有6列,它们的值与0,1,2,3中的任何一列相同。我希望显示结果,例如0表示成功,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 |

我有6列,它们的值与0,1,2,3中的任何一列相同。我希望显示结果,例如0表示成功,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  

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

如果我正确理解您的问题,听起来您只需要一个案例表达式(或者解码,如果您愿意,但这比案例表达式更不需要自文档化),大致如下:

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;
是否可以通过一次选择所有列而不是单独选择来进行解码?
没有

但是,除了使用pivot之外,我看到的唯一解决方案是使用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.我会在列之间附加逗号,并将它们保存到字符串表中

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\u REPLACE
一次替换一行值

SELECT REPLACE (REGEXP_REPLACE (REPLACE ('0,1,2,0,3,2', 0, 'S'), '[1-2]', 'F'), 3, 'NA') COL_STR 
FROM DUAL
四,。使用动态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
将更易于查看和解释,从而更易于维护。

如果您希望在一列中显示结果,则可以。但是,您的输出表明您希望结果包含在多个列中。所以我的答案是这是不可能的。您必须多次使用decode/case,可以通过取消激活表,解码生成的单个行,然后旋转回原始布局;但几乎可以肯定的是,这不值得额外的工作,只需单独解码每一列就更简单、更清晰了。