我有一个包含多个字符串列的表,我想用分隔符连接在一起。
c1 | c2 | c3 | c4 |
---|---|---|---|
a | b | c | d |
a | b | ||
a |
结果应该是
'a-b-c-d'
'a-b'
'a'
在 SQL Server 中我就是这么做的
select concat_ws('-', c1, c2, c3, c4) from my_table
在 Oracle 中我可以做到
SELECT COALESCE(c1, '') ||
CASE WHEN c2 IS NULL THEN '' ELSE '-' || c2 END ||
CASE WHEN c3 IS NULL THEN '' ELSE '-' || c3 END ||
CASE WHEN c4 IS NULL THEN '' ELSE '-' || c4 END
FROM my_table
Oracle 中是否有更好的解决方案,甚至是同时适用于 SQL Server 和 Oracle 的解决方案?
同时适用于 Oracle 和 SQL Server 的版本很棘手,因为唯一可用的字符串连接函数是带有两个参数的
concat()
。 但是,你可以这样做:
select trim('-' from
concat(coalesce(c1, ''),
concat(case when c2 is null then '' else concat('-', c2) end,
concat(case when c3 is null then '' else concat('-', c3) end,
case when c4 is null then '' else concat('-', c4) end
)
)
))
这是 SQL Server 和 Oracle 的两个 db<>fiddles。
select c1 || nvl2(c2, '-'||c2,c2) || nvl2(c3, '-'||c3,c3) || nvl2(c4, '-'||c4,c4)
from mytable
测试一下这里
一个选择是
-
作为分隔符连接所有列,然后-
符号(使用正则表达式)和-
标志(带修剪)类似这样的:
SQL> with test (c1, c2, c3, c4) as
2 (select 'a' , 'b' , 'c' , 'd' from dual union all
3 select 'a' , 'b' , null, null from dual union all
4 select 'a' , null, null, null from dual union all
5 select 'a' , null, 'c' , null from dual union all
6 select null, null, 'c' , 'd' from dual
7 )
8 select
9 c1, c2, c3, c4,
10 --
11 trim(both '-' from regexp_replace(c1 ||'-'|| c2 ||'-'|| c3 ||'-'|| c4, '-+', '-')) result
12 from test;
C1 C2 C3 C4 RESULT
-- -- -- -- --------------------
a b c d a-b-c-d
a b a-b
a a
a c a-c
c d c-d
SQL>