在开始使用XML列作为键/值类型数据的持有者之后,我想知道PostgreSQL“LIKE”和“DISTINCT”是否可以在这些数据中用于我的需要。
在上一个问题中,我发布了example table,其中也涵盖了这些主题的需求。
所以,这样的查询...
SELECT myindex, xpath('/setup/node()/text()', description) FROM temp1
通过从存储的XML的所有节点中提取所有数据来提供想要的结果。
"{mydatabase,127.0.0.1,john,4424}"
"{herdatabase,127.0.0.1,saly,5432}"
现在我尝试按键上的值过滤结果:
SELECT myindex, xpath('/setup/node()/text()', description) FROM temp1
WHERE (xpath('/setup/DBUSER/text()', description))::TEXT[] = '{saly}'::TEXT[];
获得预期结果:
"{herdatabase,127.0.0.1,saly,5432}"
1)这是一个问题,我不知道如何使用LIKE而不是'='。
SELECT myindex, xpath('/setup/node()/text()', description) FROM temp1
WHERE (xpath('/setup/DBUSER/text()', description))::TEXT[] LIKE 'aly'::TEXT[];
2)最好说我希望在所有可用数据下进行“LIKE”搜索,例如:
SELECT myindex, xpath('/setup/node()/text()', description) FROM temp1
WHERE (xpath('/setup/node()/text()', description))::TEXT[] LIKE 'aly'::TEXT[];
但这也行不通。
3)为了在现实世界中更精确,需要使用DISTINCT标准从XML中过滤可用数据,因为会有更多次相同的数据。像这样:
SELECT DISTINCT xpath('/setup/node()/text()', description) FROM temp1
WHERE (xpath('/setup/node()/text()', description))::TEXT[] LIKE 'aly'::TEXT[];
我现在已经描述了功能,但是数据和文本列类型混乱,为了获得更有条理的数据,我想切换到XML。
请根据需要帮助获得答案。
修改 Postgres 9.3,windows 7。 此处的数据位于:PostgreSQL, using xml
这是我的疑问:
SELECT LAST(myindex), LAST(description), content::text, LAST(content)
FROM (SELECT myindex, description,
(xpath('/setup/node()/text()', description)) AS content FROM temp1) AS alias
WHERE content::text ILIKE '%127%'
GROUP BY content::text;
通过尝试自己进行查询,我发现使用group by比使用group更好 它有点慢但可行 还有一些经验,是那些查询好吗?
答案 0 :(得分:1)
您可以使用UNNEST()
将子查询中的XML数组拆分为行,然后使用ILIKE检查这些值。
SELECT myindex, description, content
FROM (
SELECT myindex, description, UNNEST(xpath('/setup/node()/text()', description))::TEXT AS content
FROM temp1
) AS alias
WHERE content ILIKE '%127%'
我没有对它进行基准测试,但性能应该更好。