REGEXP提供不同的输出

时间:2018-07-20 13:51:57

标签: sql regex

我已经使用REGEXP查找文本模式,但是其中一部分存在问题。我想将票务票价计算行归类为仅包含以下标签之一:

  1. 空白(没有Q附加费)
  2. QCPN(仅存在现有格式Q20.00的实例)
  3. QPRO(只有新的附加格式Q LONSYD20.00的实例)
  4. QBOTH(有QCPN和QBOTH的例子)

SQL下面:

SELECT JOUR.JOUR_FSERNR
      AS TICKET,
   CASE
      WHEN REGEXP_LIKE (
                 JOUR.JOUR_FCA1LN
              || JOUR.JOUR_FCA2LN
              || JOUR.JOUR_FCA3LN
              || JOUR.JOUR_FCA4LN,
              'Q[[:space:]][[:alpha:]]{6}')
      THEN
         'QPRO'
      WHEN REGEXP_LIKE (
                 JOUR.JOUR_FCA1LN
              || JOUR.JOUR_FCA2LN
              || JOUR.JOUR_FCA3LN
              || JOUR.JOUR_FCA4LN,
              'Q[[:digit:]]+\.[[:digit:]]+.*END')
      THEN
         'QCPN'
      WHEN     REGEXP_LIKE (
                     JOUR.JOUR_FCA1LN
                  || JOUR.JOUR_FCA2LN
                  || JOUR.JOUR_FCA3LN
                  || JOUR.JOUR_FCA4LN,
                  'Q[[:space:]][[:alpha:]]{6}')
           AND REGEXP_LIKE (
                     JOUR.JOUR_FCA1LN
                  || JOUR.JOUR_FCA2LN
                  || JOUR.JOUR_FCA3LN
                  || JOUR.JOUR_FCA4LN,
                  '[[ALPHA]]{3}Q[[:digit:]]+\.[[:digit:]]')
      THEN
         'QBOTH'
      ELSE
         NULL
   END
      AS QTYPE,
      ( (JOUR.JOUR_FCA1LN || JOUR.JOUR_FCA2LN) || JOUR.JOUR_FCA3LN)
   || JOUR.JOUR_FCA4LN
      AS FARECALC
FROM "S00BJOUR" JOUR
WHERE JOUR.JOUR_FSERNR = '9999889652'

如果您查看上述SQL并找到了输出'QCPN'的CASE WHEN行,您将看到一个“ END”文本字符串'Q[[:digit:]][[:graph:]]END'。我在其中输入“ END”,因为我只希望REGEXP在票价计算行中位于“ END”的左侧。

但是它给了我一些不正确的输出,如所附图像Incorrect Outputs in RED中所示:

感谢您提供任何纠正此问题的帮助。

1 个答案:

答案 0 :(得分:0)

感觉很奇怪,您没有放置太多的量词。像QCPN一样,无论意味着什么:

Q[[:digit:]]{2}\.[[:digit:]]{2}

至少要与您的Q20.00示例匹配。

编辑:

在您的“ with end exemple”中,没有用,因为您没有放置任何量词:

Q[[:digit:]][[:graph:]]END
#Match Q5.END, Q22END, Q8AEND
#Dont match Q20.00 END

但是:

Q[[:digit:]]+\.[[:digit:]]+.*END
#Match "Q1.2 ZA VD END Q20.2"
#Dont match "Q5.END", "BF END Q10.25"

对于第二个问题QPRO / QBOTH,问题是:

Q HAMAOQ20.00

尝试

[[:space:]]Q[[:digit:]]+\.[[:digit:]]+.

对于QCPN正则表达式。