![](/img/trans.png)
[英]Split a column into multiple rows based on multiple delimiters in 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.