SQL按唯一值筛选文本字符串
我的PostgreSQL数据库包含一个列,该列是一个文本字符串,具有唯一但不可预测的值,如下所示:SQL按唯一值筛选文本字符串,sql,postgresql,csv,unnest,Sql,Postgresql,Csv,Unnest,我的PostgreSQL数据库包含一个列,该列是一个文本字符串,具有唯一但不可预测的值,如下所示: id var 1 "A", "B" 2 "B", "C" 3 "C", "A" 4 "eggs", "toast" 5 "eggs", "bacon"
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\u split\u to\u 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)