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 模式匹配,因为它返回布尔值。
我有充分的理由(/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)