TRIM 不适用于 PostgreSQL 中 xpath 的行和选项卡?

问题描述 投票:0回答: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 的错误吗?如何使用 XPath 来应用
fn:normalize-space()
?我需要类似“哪里标题不为空”之类的东西? (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. 我可以在 xpath 中使用

    normalize-space()
    吗?怎么办?

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

postgresql xpath
2个回答
1
投票

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

postgres=# 选择修剪(unnest(string_to_array(e' 你好)
你好
你好,e'
')), e' ');
 修剪
--------
 你好
 你好
 你好
(3行)

你的正则表达式替换任何字符 或者 或,但修剪使用字符串“ ”。它的含义与你想象的不同。


1
投票

...9 年后,在提问之后,关注 XML 趋势和 PostgreSQL 的演变。
  (这是 WIKI 请编辑!)

2023 年(及之前)PostgreSQL 中 XML 的通用解决方案

使用 XML 数据类型 仅用于基本存储
对于任何其他应用程序,将 XML 转换为 JSONb

XML 和 JSON 是“文档模型”,它们是可以互换的(可以转换)。但是,这是开发人员的选择,只有 JSONb 得到了发展: 所有处理函数和运算符在过去十年中都已在 JSONb 中实现。

这里是 JSONB 中相同 XML 事物的示例,它运行良好并且符合您的直觉!

SELECT 'line'||ROW_NUMBER() over(),
       trim(obj->>'p',E'\n\r\t ') with_trim,
       obj->>'p' AS no_trim
FROM jsonb_path_query(
  '[{"x":1,"p":"  text1  text2   "},{"y":2,"p":"\t\ntext3 text4 \n \n "}]',
  '$[*]'
) t(obj);
  with_trim 无修剪
效果 修剪删除所有 所有线条和空格都保留在那里
结果行1
text1  text2
 text1  text2  
结果线2
text3 text4
\t\ntext3 text4 \n \n 

PS:对于 JSONb 数值,如

obj->'x'
,最有效的方法是直接通过
(obj->'x')::int
进行转换。运算符
->>
将 JSONb 字符串转换为 SQL 文本:所有 SQL 文本函数都按预期使用它,没有意外

PostgreSQL 团队放弃了 XML

XML 处理于 1999 年随 XPath v1 一起诞生;并于 2007 年发展为 XPath 2.0,然后于 2014 年发展为 XPath 3.0,最后于 2017 年发展为 XPath 3.1...

但是,自 2000 年以来,XPath 1.0 仍然是所有 PostgreSQL 版本中可用的唯一版本。


关于 W3C 视角的注意事项。 2023 年或未来没有官方消息。停止使用 XPath v3,因为它非常复杂,并且只有少数利基应用程序真正需要它

© www.soinside.com 2019 - 2024. All rights reserved.