10

我有这个SQL查询,我正在使用Postgresql.

select * from cdr_data 
  where REGEXP_LIKE(identifiant,'^73')
    and REGEXP_REPLACE(callednumber,'^256','') ~ '^73'

它给了我以下错误:

[Err] ERROR:  function regexp_like(character varying, unknown) does not exist
LINE 2: and  regexp_like(identifiant,'^73')

我试过用REGEXP_LIKEwith代替LIKEREGEXP_MATCHES但它们不起作用。

可能是什么问题呢?

4

3 回答 3

18

PostgreSQL 的等价物regexp_like(identifiant,'^73')identifiant ~ '^73'

于 2013-01-16T08:34:29.730 回答
3

您是否尝试过使用SIMILAR TO运算符?

PostgreSQL 文档中的一些片段:

a. `select 'abc' SIMILAR TO '(a|d)%';`
b. `select 'def' SIMILAR TO '(a|b|c)%';`

语句 a 返回t(true),因为 'abc' 以 'a' 或 'd' 开头。语句 b 返回f(false),因为“def”不以“a”或“b”或“c”开头。

于 2018-07-14T09:08:42.113 回答
0

实际上,您可以使用以下功能之一

value_or_colum_name ~ '<regex-expression>'
value_or_colum_name SIMILAR TO '<regex-expression>'
TEXTREGEXEQ(value_or_colum_name,'<regex-expression>')

所有这 3 种可能性是完全等价的。

REGEXP_LIKESqlPostGreSQL 上不存在该函数。但是REGEXP_MATCHES并且REGEXP_REPLACE存在。

这是一个命令~REGEXP_REPLACE我用它来检查我的正则表达式是否在启动 SQL 之前正常工作UPDATE

SELECT communication
      ,REGEXP_REPLACE
         (communication
         ,'(\d{3})(\d{4})(\d{5})'
         ,'***\1/\2/\3***'
         ) as ref 
  FROM mouvements 
  WHERE communication ~ '^\d{12}$'

这给出了以下结果

comm            ref
------------------------------------
303000167868    ***303/0001/67868***
121231357408    ***121/2313/57408***
321000204456    ***321/0002/04456***

最后的 UPDATE 命令是

UPDATE mouvements
  SET communication = NULL
     ,Ref_Structured = REGEXP_REPLACE(communication,'(\d{3})(\d{4})(\d{5})','***\1/\2/\3***')
  WHERE communication ~ '^\d{12}$'

另一个拆分列的 SQLUPDATE命令是 2

UPDATE mouvements
  SET nom = REGEXP_REPLACE(nom,'^(.*)(REFERENCE DONNEUR D''ORDRE : )(.*)','\1')
     ,RefDonneur = REGEXP_REPLACE(nom,'^.*(REFERENCE DONNEUR D''ORDRE : )(.*)','\2')
  where nom ~ 'REFERENCE DONNEUR D''ORDRE :'
于 2022-02-10T08:13:02.483 回答