【问题标题】:postgres - using SIMILAR TO in a CASE clausepostgres - 在 CASE 子句中使用 SIMILAR TO
【发布时间】:2018-12-28 21:41:04
【问题描述】:

我有一列包含扫描的条形码字符串。我想找到一个特定的匹配项并在新列中返回字符串“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 = boolean 第 3 行:(CASE 报告。"barcode" WHEN (report."barcode...

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

我对 SQL 很陌生,所以当文档说它需要一个真/假语句之后,我想我可以使用 SIMIAR TO 模式匹配,因为它返回布尔值。

【问题讨论】:

    标签: sql regex postgresql pattern-matching


    【解决方案1】:

    我有充分的权威 (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+%$'
    

    【讨论】:

      【解决方案2】:

      您对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;
      

      【讨论】:

        【解决方案3】:

        你只需要在大小写之后省略report."barcode"

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-30
          • 2021-07-07
          • 1970-01-01
          • 2016-03-24
          • 2021-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多