Oracle11g 使用decode选择多个列
我有6列,它们的值与0,1,2,3中的任何一列相同。我希望显示结果,例如0表示成功,1或2表示失败,3表示不适用。因此,如果以DB为单位,则值为: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 |
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,可以通过取消激活表,解码生成的单个行,然后旋转回原始布局;但几乎可以肯定的是,这不值得额外的工作,只需单独解码每一列就更简单、更清晰了。