我正在开发一个将数据库从 Informix 迁移到 Postgresql 的项目,但无法在 Postgresql 中找到“MATCHES”的替代品。下面是我试图在 Postgresql 中运行的 sql 查询。
SELECT DISTINCT ca.cust_id, a.acct_id FROM cust_acct ca
JOIN acct a on a.acct_id = ca.acct_id
JOIN cust_address cas on ca.cust_id = cas.cust_id
JOIN cust c on ca.cust_id = c.cust_id
JOIN phone cp on c.cust_id = cp.cust_id
WHERE a.recog_id MATCHES '*2972*'
AND cas.last_name MATCHES '*[Q-T]'
AND cas.frst_name MATCHES '[Uu]*'
AND cas.city MATCHES '*X'
AND cas.county MATCHES '*'
AND cp.number MATCHES '*54123'
问题 我在 Postgresql 中找不到可以用来替换“MATCHES”的表达式,并且在 java 代码中没有做任何更改。虽然在这里,
https://www.postgresql.org/docs/current/functions-matching.html#:~:text=9.7.2.%C2%A0SIMILAR%20TO%20Regular%20Expressions%20%23
文档说 SIMILAR TO 使用 POSIX 正则表达式,但我没有看到这种情况发生。即使我将 '*' 替换为 '%' ,它在 Postgresql 中也不会给出相同的结果:
SELECT DISTINCT ca.cust_id, a.acct_id FROM cust_acct ca
JOIN acct a on a.acct_id = ca.acct_id
JOIN cust_address cas on ca.cust_id = cas.cust_id
JOIN cust c on ca.cust_id = c.cust_id
JOIN phone cp on c.cust_id = cp.cust_id
WHERE a.recog_id LIKE '%2972%'
AND cas.last_name LIKE '%[Q-T]'
AND cas.frst_name LIKE '[Uu]%'
AND cas.city LIKE '%X'
AND cas.county LIKE '%'
AND cp.number LIKE '%54123'
我已经尝试过“SIMILAR TO”,但仍然没有给出预期的结果。
问题 来自 https://www.ibm.com/docs/en/informix-servers/14.10?topic=condition-matches-operator
MATCHES '*[Q-T]'
-> 对于任何以 Q 到 T 字母结尾的名称,条件为 TRUE。如何在 Postgresql 中执行此操作?
'%' 是 postgresql 中接受的通配符吗?将所有“*”(informix 接受的通配符)替换为“%”以使正则表达式正常工作是否安全?
已经尝试过 regex_matches() 但这也不起作用。
matches
和之间进行一对一翻译,类似于。
比赛 | 类似于 |
---|---|
* | % |
? | _ |
[...] | [...] |
[^...] | [^...] |
\ | \(但是,有些组合很特殊,例如 ) |
你的例子的翻译是......
WHERE a.recog_id similar to '%2972%'
AND cas.last_name similar to '%[Q-T]'
AND cas.frst_name similar to '[Uu]%'
AND cas.city similar to '%X'
-- this is basically `AND cas.county is not null`
AND cas.county similar to '%'
AND cp.number similar to '%54123'