问题描述
我的Postgresql数据库包括一列,该列是一个文本字符串,它具有唯一但不可预测的值,例如:
id var
1 "A","B"
2 "B","C"
3 "C","A"
4 "eggs","toast"
5 "eggs","bacon"
我需要一个SQL查询,该查询将var
中的唯一值提取出来,像这样...
1 A
2 B
3 C
4 bacon
5 eggs
6 toast
解决方法
您可以使用regexp_split_to_table()
拆分这些CSV字符串,然后仅保留不同的值
select distinct x.str
from mytable t
cross join lateral regexp_split_to_table(t.var,',') x(str)
如果您确实在CSV元素周围有双引号,并且想要从结果中将其删除,则:
select distinct replace(x.str,'"','') str
from mytable t
cross join lateral regexp_split_to_table(t.var,') x(str)
有趣的是,我们还可以使用json:用方括号括起来的字符串使它们成为有效的json数组字符串,然后可以用jsonb_array_elements_text()
取消嵌套(一个好处是它可以为我们处理取消引用的情况)在幕后):
select distinct x.str
from mytable t
cross join lateral jsonb_array_elements_text( ('[' || t.var || ']')::jsonb) x(str)