我有一列,其中包含扫描条形码的字符串。我想找到一个特定的匹配项,并在新列中返回字符串“ 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语句,因为它返回布尔值。
答案 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 ......