SQL通过唯一值过滤文本字符串

问题描述

我的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

...但是我对sql中的文本内容不太了解。帮助吗?

解决方法

您可以使用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)

Demo on DB Fiddle