【问题标题】:Teradata LIKE for range for values - (regular expression?)用于值范围的 Teradata LIKE - (正则表达式?)
【发布时间】:2023-03-12 13:30:01
【问题描述】:

在 Teradata 中,我需要一个条件来仅选择记录:

  • 从 0 到 4 之间的数字开始
  • 后跟字符串 ABCD
  • 什么都跟着

我可以使用子字符串并且它可以工作。但这不是一段很好的代码。

SELECT
    '4ABCDXXX' AS T  
    , CASE WHEN   
        Cast (Substring (T, 1,1) AS SMALLINT) BETWEEN 0 AND 4  
        AND Substring (T, 2,4) = 'ABCD'
        THEN 'OK' ELSE 'NOK' END  

我试过了

LIKE '[0-4]ABCD%'

但这似乎不起作用...
如何优雅地实现这一点?

谢谢。

【问题讨论】:

    标签: teradata sql-like


    【解决方案1】:

    我认为 Teradata 不支持您尝试的增强型 LIKE 语法。但是,我们可以使用REGEXP_SIMILAR

    SELECT
        '4ABCDXXX' AS T,
        CASE WHEN REGEXP_SIMILAR('4ABCDXXX', '^[0-4]ABCD.*$', 'c')
             THEN 'OK' ELSE 'NOK' END AS label
    FROM yourTable;
    

    【讨论】:

    • 谢谢。这看起来不错。一个细节 - 仅当字符串在 ABCD 之后没有任何内容时才匹配。我想要它以便任何东西都可以跟随它吗:RegExp_Similar(T, '^[0-4]ABCD\w*', 'i')。谢谢,R。
    • @hro1979 当然,我不太了解这个 API。我猜在这种情况下你想要的模式是^[0-4]ABCD.*$
    • 是的,对于 REGEXP_SIMILAR 模式必须匹配整个字符串,即隐含地表现得好像你在开头有 ^ 和在结尾有 $,无论你是否明确指定。
    【解决方案2】:

    我一直无法在 Teradata 中使用负前瞻,因此我将使用两个测试:

    select 
    '4ABCD123' as t,
    case when 
      regexp_similar(t,'^[0-4]ABCD') = 1   -- starts with 0-4 followed by ABCD
      and  t like '%ABCD'                  -- does not end with ABCD
    then 'nok' else 'ok' end,
    

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多