【问题标题】:SQL filtering a text string by unique valuesSQL 按唯一值过滤文本字符串
【发布时间】:2021-02-12 00:52:41
【问题描述】:

我的 PostgreSQL 数据库包含一个列,该列是一个文本字符串,它采用唯一但不可预测的值,如下所示:

id    var
1     "A", "B"
2     "B", "C"
3     "C", "A"
4     "eggs", "toast"
5     "eggs", "bacon"

我需要一个从var 中提取唯一值的 SQL 查询,就像这样...

1 A
2 B
3 C
4 bacon
5 eggs
6 toast

...但我对 SQL 中的文本内容不太熟悉。帮忙?

【问题讨论】:

  • 您的array 列是实际的数组类型列吗?
  • 不,只是文本。我更改了名称以避免混淆。

标签: sql postgresql csv unnest lateral-join


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多