postgres - 在 CASE 子句中使用 SIMILAR TO

Han*_*Che 0 regex sql 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
Run Code Online (Sandbox Code Playgroud)

但是我总是收到这个错误

错误:运算符不存在:文本 = 布尔值第 3 行:(CASE 报告。“条形码”WHEN (报告。“条形码...

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

我对 SQL 相当陌生,所以当文档说它在 WHEN 之后需要一个 true/false 语句时,我认为我可以使用 SIMIAR TO 模式匹配,因为它返回布尔值。

Ham*_*one 5

我有充分的理由(/sf/answers/872178261/),没有充分的理由使用“类似”。从引用的链接:

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
Run Code Online (Sandbox Code Playgroud)

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

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

'^\d{5,8}%\d+%$'
Run Code Online (Sandbox Code Playgroud)