PostgreSQL,使用带有LIKE和DISTINCT的XML

时间:2014-01-28 22:17:31

标签: postgresql

在开始使用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更好 它有点慢但可行 还有一些经验,是那些查询好吗?

1 个答案:

答案 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%'

我没有对它进行基准测试,但性能应该更好。