我有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
是否可以通过一次选择所有列而不是单独选择它来通过解码来实现?
答案 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)
所有这些都非常乏味,可能需要一些时间。使用DECODE
或CASE
会更容易查看和解释,从而更容易维护。