PostgreSQL:根据列值转换列

时间:2017-10-18 21:41:32

标签: sql postgresql

我想根据下面的值转换表格中的col_A

col_A
----------------------------
Hello_axd_sdc_we_world
Hello_g_world
Hello_world
Goodbye_A
Goodbye_sdg_Sda
Goodbye
Goodbye_asd_asd_Sddg

我希望转换后的列d_col_A看起来像:

col_A                            d_col_A
-----------------------------------------
Hello_axd_sdc_we_world           Hello_world 
Hello_g_world                    Hello_world 
Hello_world                      Hello_world 
Goodbye_A                        Goodbye
Goodbye_sdg_Sda                  Goodbye
Goodbye                          Goodbye
Goodbye_asd_asd_Sddg             Goodbye

这是我的规则:

If col_A starts with Hello and end with World
   Then d_col_A = Hello_Wolrd
If col_A starts with Goodbye
   Then d_col_A = Goodbye

这可能吗?谢谢!

1 个答案:

答案 0 :(得分:1)

创建一个名为' lookup'或者像ID,first_param,second_param,translate_value

那样的东西
1,hello,world,hello_world
2,goodbye,null,goodbye

现在有些人加入了。 Postgres有一个left()和right()以及length()函数,我们可以在这里使用它。如果需要,更复杂的规则集还可以包含类似的函数(第三个参数=必须包含这个单词?)。

Select a.col_A , l.translate_value
from table_a a
left join lookup_table l
  on left(a.col_a,length(l.first_param)) = l.first_param
  and (right(a.col_a,length(l.second_param)) = l.second_param or l.second_param is null)

我做了一个左连接,所以当规则不满足而不是删除行时会产生空值。我缺乏postgres测试环境,但语法应该是正确的。

案例版

select case when left(col_a,5) = hello and right(col_a,5) = 'world' then 'hello world' 
case when left(col_a,7) = 'goodbye' then goodbye
else 'no clue what this means'
from table_a