繁体   English   中英

根据特殊字符的存在和 Postgres 中的字符串匹配将列值拆分为多行

[英]Split a column value to multiple rows based on special character presence and a string match in Postgres

我在 Postgres11 中有下表

col1            col2                       col3
NCT00065442 APC-Placebo                    apc-placebo
NCT00135226 Placebo                        placebo
NCT00146640 MR Prednisone                  mr prednisone
NCT00146640 Placebo - IR Prednisone        placebo - ir prednisone

如果字符串有安慰剂并且有“-”特殊字符,我想拆分 col3。

所需的 output 是:

col1            col2                       col3
NCT00065442 APC-Placebo                    apc
NCT00065442 APC-Placebo                    placebo
NCT00135226 Placebo                        placebo
NCT00146640 MR Prednisone                  mr prednisone
NCT00146640 Placebo - IR Prednisone        placebo
NCT00146640 Placebo - IR Prednisone        ir prednisone

到目前为止,我已经尝试过以下查询。

select *, 
case when col3 ilike '%placebo%' and col3 ~* '-'
        then unnest(string_to_array(col3, '-'))
     else col3
end
from table 
order by col1;

我还尝试将 unnest(string_to_array) function 替换为:

UNNEST(REGEXP_SPLIT_TO_ARRAY(t.name, '\s*[-]\s*'))

CASE表达式中不允许使用unnest()类的函数。
你可以用UNION ALL做到这一点:

select col1, col2, trim(unnest(string_to_array(col3, '-'))) col3
from tablename 
where col3 like '%placebo%'
union all
select col1, col2, col3                
from tablename 
where col3 not like '%placebo%'

演示
结果:

| col1        | col2                    | col3          |
| ----------- | ----------------------- | ------------- |
| NCT00065442 | APC-Placebo             | apc           |
| NCT00065442 | APC-Placebo             | placebo       |
| NCT00135226 | Placebo                 | placebo       |
| NCT00146640 | Placebo - IR Prednisone | placebo       |
| NCT00146640 | Placebo - IR Prednisone | ir prednisone |
| NCT00146640 | MR Prednisone           | mr prednisone |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM