postgres-在CASE子句中使用SIMILAR TO

时间:2018-12-28 21:41:05

标签: sql regex postgresql pattern-matching

我有一列,其中包含扫描条形码的字符串。我想找到一个特定的匹配项,并在新列中返回字符串“ match”和“ noMatch”

条形码的正则表达式为

  

'[0-9] {5,8} \%[0-9] * \%'

例如13412432%10000%

我的查询是

SELECT 
report."barcode" SIMILAR TO '[0-9]{5,8}\%[0-9]*\%',
(CASE report."barcode" WHEN (report."barcode" SIMILAR TO '[0-9]{5,8}\%[0-9]*\%') THEN 'match'
ELSE 'noMatch'
END) AS matchColumn
FROM report

但是我总是遇到此错误

  

错误:运算符不存在:text =布尔值   第3行:(案例报告。“条形码”何时(报告。”条形码...

     

提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。   SQL状态:42883   角色:106

我对SQL还是很陌生,因此当文档说它希望在我认为可以使用SIMIAR TO模式匹配之后会返回true / false语句,因为它返回布尔值。

3 个答案:

答案 0 :(得分:2)

基于良好的权威(https://stackoverflow.com/a/12459689/1278553),我没有充分的理由使用“类似于”。从引用的链接:

  

SIMILAR TO是SQL标准的一部分,但是它的语法很奇怪,并且   PostgreSQL支持它的唯一原因是保持标准兼容性。   在内部,每个SIMILAR TO表达式都使用正则表达式重写   表达。因此,对于任何给定的SIMILAR TO表达式,存在   至少一个正则表达式可以更快地完成相同的工作。

请注意,如果您将其更改为正则表达式,它甚至应该像这样简单:

select
  r.barcode, 
  case
    when r.barcode ~ '\d{5,8}%\d+%' then 'match'
    else 'noMatch'
  end as matchcolumn
from report r

您不需要使用正则表达式转义%字符。

如果您对字符串中间出现的模式不满意,则可能需要锚定正则表达式的开头和/或结尾:

'^\d{5,8}%\d+%$'

答案 1 :(得分:1)

case之后,您对该列有额外的引用。您想要的表达式是:

SELECT report."barcode" SIMILAR TO '[0-9]{5,8}\%[0-9]*\%',
       (CASE WHEN report."barcode" SIMILAR TO '[0-9]{5,8}\%[0-9]*\%' 
             THEN 'match'
             ELSE 'noMatch'
        END) AS matchColumn
FROM report;

答案 2 :(得分:0)

您只需要在情况后省略report."barcode"

          Case --omit this report."barcode
              when  ......