2

有了这个查询

SELECT trim(title) FROM (
  SELECT
    unnest( xpath('//p[@class="secTitle1"]', xmlText )::varchar[] ) AS title
  FROM t1 
) as t2

以及带有行和空格的 XML 输入文本,

  <root>
  ...
  <p class="x">

         text text
         text text
  </p><p> ...</p>
  ...
  </root>

trim()没有效果(!)。这是一个 PostgreSQL 错误?如何申请fn:normalize-space()XPath?我需要类似“WHERE title is not null”之类的东西?(Oracle 更简单……) 如何用 PostreSQL 做这个简单的查询?

解决方法

我需要一个配置良好的内置函数,而不是解决方法......但我需要工作并显示结果,所以我使用正则表达式......

    SELECT id, TRIM(regexp_replace(tit, E'[\\n\\r\\t ]+', ' ', 'g')) AS tit
    FROM (
        SELECT 
          id, -- xpath returns array of 1, 2, or more strings
          unnest( xpath('//p[@class="secTitle1"]', texto )::VARCHAR[] ) AS tit
        FROM t
    ) AS tmp

因此,“仅简单的空间修剪”是不友好的,而不是 util (!)。

在@mu评论后编辑

我试试

    SELECT id, TRIM(tit, E'\\n\\r\\t') AS tit

    SELECT id, TRIM(tit, '\n\r\t') AS tit

两者都不起作用。


问题仍然存在:

  1. 没有 TRIM 选项或 postgresql 配置可以根据需要对 TRIM 工作说吗?

  2. 我可以normalize-space()在 xpath 上使用吗?如何?

  3. 我使用的是 PostgreSQL 9.1,需要升级吗?

4

1 回答 1

1

它适用于 9.2,它也适用于 8.4。

postgres=# select trim(unnest(string_to_array(e'\t\tHello\n\t\tHello\n\t\tHello', e'\n')), e'\t');
 修剪
--------
 你好
 你好
 你好
(3 行)

您的正则表达式替换任何字符 \n 或 \r 或 \t,但修剪使用字符串“\n\r\t”。它的含义与您预期的不同。

于 2013-08-06T19:29:44.997 回答