通过此查询
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
两者都不起作用。
没有 TRIM 选项或 postgresql 配置可以让 TRIM 按需要工作?
我可以在 xpath 中使用
normalize-space()
吗?怎么办?
我使用的是PostgreSQL 9.1,需要升级吗?
它适用于 9.2,也适用于 8.4。
postgres=# 选择修剪(unnest(string_to_array(e' 你好) 你好 你好,e' ')), e' '); 修剪 -------- 你好 你好 你好 (3行)
你的正则表达式替换任何字符 或者 或,但修剪使用字符串“ ”。它的含义与你想象的不同。
...9 年后,在提问之后,关注 XML 趋势和 PostgreSQL 的演变。
(这是 WIKI 请编辑!)
使用 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 |
|
|
结果线2 |
|
|
PS:对于 JSONb 数值,如
obj->'x'
,最有效的方法是直接通过 (obj->'x')::int
进行转换。运算符 ->>
将 JSONb 字符串转换为 SQL 文本:所有 SQL 文本函数都按预期使用它,没有意外。
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,因为它非常复杂,并且只有少数利基应用程序真正需要它。