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