给定字符串:
'我认为 PostgreSQL 很漂亮'
我想对该字符串中的单个单词进行操作。本质上,我有一个单独的,我可以从中获取单词详细信息,并希望在该字典中加入该字符串的未嵌套数组。
到目前为止,我有:
select word, meaning, partofspeech
from unnest(string_to_array('I think that PostgreSQL is nifty',' ')) as word
from table t
join dictionary d
on t.word = d.wordname;
这完成了我希望做的基本工作,但它不保留原始词序。
WITH ORDINALITY
在 Postgres 9.4 或更高版本中查询现在可以简单地是:
或者,应用于表格:
细节:
关于隐式
LATERAL
连接:db<>fiddle here
旧的 sqlfiddle
Postgres 9.3 或更早版本 - 以及更一般的解释
对于单个字符串
您可以应用窗口函数
row_number()
来记住元素的顺序。但是,通常row_number() OVER (ORDER BY col)
您会根据排序顺序获得数字,而不是字符串中的原始位置。您可以简单地省略
ORDER BY
以获得“原样”的位置:regexp_split_to_table()
长字符串会降低 性能。unnest(string_to_array(...))
规模更好:然而,虽然这通常有效,而且我从未见过它在简单查询中中断,但 Postgres 对没有显式
ORDER BY
.为保证原始字符串中元素的序数,请使用
generate_subscript()
(由@deszo 评论改进):对于字符串表
添加
PARTITION BY id
到OVER
子句...演示表:
我用作主键
ctid
的临时替代品。如果您有一个(或任何唯一列),请改用它。这在没有任何不同 ID 的情况下有效:
回答问题