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

SQL filtering a text string by unique values

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