Postgresql 中的哪个表达式与 Informix 中的“MATCHING”相同

问题描述 投票:0回答:1

我正在开发一个将数据库从 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() 但这也不起作用。

sql regex postgresql informix
1个回答
0
投票

您可以在

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'
© www.soinside.com 2019 - 2024. All rights reserved.