【问题标题】:postgresql - unnest, for each resultpostgresql - 不嵌套,对于每个结果
【发布时间】:2018-03-28 14:28:52
【问题描述】:

我想创建一个视图,并对 unnest 函数的每个结果进行一些数据处理。

在我的专栏 column2 中,我有:

  1. “12345”
  2. “123456”
  3. “12345,123456”或更多数字

我想做一些 unnest(col2, ',') 并为每个结果做这样的事情:

if length(col2) = 5 then treatment_1
else if length(col2) = 6 then treatment_2

表中示例:

col1      col2        
-------------------
D1        12345, 123456
D3        12345
D4        123456

视图中的预期结果(对 col2 中的每一行进行处理):

col1      col2        
-------------------
D1        12345
D1        123456
D3        12345
D4        123456

【问题讨论】:

  • col2 是什么数据类型?
  • Col2 是一个字符串。

标签: postgresql unnest


【解决方案1】:

您可以使用regexp_split_to_table 将字符串拆分为多行:

select  t1.col1
,       case 
        when length(split.col2) > 5 then right(split.col2, 3)
        else replace(split.col2, '123', '***')
        end as col2
from    Table1 t1
cross join
         regexp_split_to_table(t1.col2, '\s*,\s*') split(col2)

Working example at SQL Fiddle.

【讨论】:

  • 好的,我知道该怎么做,但是如何对每个结果进行处理?
  • 什么样的治疗?你可以使用case,比如when len(col2) > 5 then ... else ... end。但这只能转换一个值,不能将其拆分为多行
  • 我想两者都做。首先拆分,并对每个值进行一些处理(我想应用一个正确的函数和一个替换)。
  • 好的,你可以在case中做rightreplace,添加示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多