我的问题的模拟代码:
SELECT Id FROM Tags WHERE TagName IN '<osx><keyboard><security><screen-lock>'问题的细节
我正在尝试从apple.stackexchange数据中获取2011年使用的标签。(此查询)
作为能看见,标记更改中的标记以纯文本形式存储在Text字段中。

<tag1><tag2><tag3>
<osx><keyboard><security><screen-lock>如何创建标记的唯一列表,以便在Tags表中查找它们,而不是这个硬编码版本:
SELECT * FROM Tags
WHERE TagName = 'osx'
OR TagName = 'keyboard'
OR TagName = 'security'这是一个交互示例。
Stackexchange使用T,我的本地副本使用Postgres应用程序9.4.5.0版在postgresql下运行.
发布于 2015-12-29 06:11:30
假设此表定义如下:
CREATE TABLE posthistory(post_id int PRIMARY KEY, tags text);具体取决于您想要的内容:
若要将字符串转换为数组,请修剪前导并尾随“<>”,然后将'><‘视为分隔符:
SELECT *, string_to_array(trim(tags, '><'), '><') AS tag_arr
FROM posthistory;要获得整个表的唯一标记列表(,我猜您想要这个):
SELECT DISTINCT tag
FROM posthistory, unnest(string_to_array(trim(tags, '><'), '><')) tag;隐式LATERAL联接需要Postgres9.3或更高版本。
这应该比使用正则表达式快得多。如果您想尝试regexp,请使用regexp_split_to_table()而不是regexp_split_to_array(),后面跟着unnest(),就像在另一个答案中建议的那样:
SELECT DISTINCT tag
FROM posthistory, regexp_split_to_table(trim(tags, '><'), '><') tag;也可以使用隐式LATERAL连接。相关信息:
要搜索特定的标记:
SELECT *
FROM posthistory
WHERE tags LIKE '%<security>%'
AND tags LIKE '%<osx>%';SQL Fiddle
应用于我们的数据资源管理器中的to搜索:
SELECT TOP 100
PostId, UserId, Text AS Tags FROM PostHistory
WHERE year(CreationDate) = 2011
AND PostHistoryTypeId IN (3 -- initial tags
, 6 -- edit tags
, 9) -- rollback tags
AND Text LIKE ('%<' + ##TagName:String?postgresql## + '>%');(T语法使用非标准的+而不是||。)
https://stackoverflow.com/questions/34485255
复制相似问题