【问题标题】:Alternative to like/ like any?... regexp?替代喜欢/喜欢任何?...正则表达式?
【发布时间】:2014-04-21 18:19:32
【问题描述】:

我有一个类似于以下的 TERADATA 数据集:

Customer_ID | Targeting_Region

    12      | targ=EU, targ=!Eu.Fr

    34      | targ=Asia

    56      | targ=!EU

“!”表示“不等于”。例如,第 1 行的客户想要定位欧盟,但排除法国。

我想创建一个字段来标记(带有“1”)任何存在“肯定”定位的行。通过“肯定”定位,我指的是明确包含特定区域的任何行(“否定”定位是明确排除某个区域的位置,例如在第 1 行中排除法国)。例如,第 1 行同时包含正面和负面定位,第 2 行仅包含正面定位,第 3 行仅包含负面定位。

我遇到的问题是一个简单的 case 语句不起作用(据我所知)。我尝试了以下两种说法:

(case when targeting_region like '%targ=%'; then 1 else 0 end) as target_flag

(case when ((targeting_region like '%targ=%';) and (targeting_region not like '%targ=!%';)) then 1 else 0 end) as target_flag 

上面的第一条语句不起作用,因为它会为 'targ=' 和 'targ=! 都返回 1!

上面的第二条语句不起作用,因为它将为仅具有肯定定位的行返回 1。因此,第 1 行(上图)将返回 0(我希望它返回 1)

请注意,“targ=”后面的值也可以是数字。例如,'targ=12345'

关于如何实现这一点的任何想法?我听说 teradata 有一个叫做 regexp 的东西,但经过一番搜索后,我无法找到一个很好的解释。

谢谢!

【问题讨论】:

    标签: sql regex teradata


    【解决方案1】:

    也许不完全是你要找的,但如果你只在有一个正目标而没有负目标时才想要一个 1,那么为什么不把它设为 0,如果存在一个负目标,否则设为 1?

    例如,

    case when targeting_region like '%targ=!%' then 0
    when targeting_region like '%targ=%' then 1
    else null -- Optional if you want to handle when no targeting regions exist
    end as target_flag
    

    【讨论】:

    • 我遇到的问题是某些行将同时具有正目标和负目标。例如,请参阅我原始帖子中的第 1 行。像这样的一行将在您的代码中返回 0,而我需要它返回 1。不过,感谢您的回复!
    【解决方案2】:

    这样的东西会起作用吗?

    (当 REGEXP_INSTR(targeting_region,'targ=[A-Z,a-z]') = 0; then 0 else 1)

    我在以下位置找到 REGEXP_INSTR() 的语法和示例 http://www.info.teradata.com/HTMLPubs/DB_TTU_14_00/index.html#page/SQL_Reference/B035_1145_111A/Regular_Expr_Functions.085.03.html#ww14955402

    由于此站点上的信息太少,您将不得不对其进行修改才能使其正常工作。

    例如...

    “...targ=...”中的等号,甚至可能是左右括号,可能需要转义,可能需要使用反斜杠。此外,上面假设如果没有匹配,则函数返回 0(而不是 NULL)。它可能需要从“=0”更改为“IS NULL”。另外,我假设前两个之后的参数是可选的。您可能需要指定它们,例如“1,1,i”。此外,如果您能找到更好的文档,可以稍微简化表达式,例如使用 [A-Z,a-z] 的快捷方式。

    说明: 第二个参数指定要在第一个参数中查找的“模式”。 1. "targ=" 寻找那些字符。 2. "[A-Z,a-z]" 查找字母字符。如果一个 ”!”发生,它将不匹配,搜索将继续字符串的其余部分。 3. REGEXP_SUBSTR() 返回在字符串中找到模式的字符位置。这有点矫枉过正,因为您只想知道是找到了还是没有找到,但希望它可以工作,因为我找不到更简单的函数。

    【讨论】:

      【解决方案3】:

      如果我理解正确,您希望 1 是否有任何包含的目标,而不管其他排除区域如何?

      这会搜索 'targ=' 后跟除 '!' 之外的任何其他字符:

      CASE WHEN REGEXP_INSTR(Targeting_Region,'targ=[^!]') = 0 THEN 0 ELSE 1 END
      

      如果您的版本不包含 REGEXP 函数,则可能存在 OREPLACE:

      CASE WHEN POSITION('targ=' IN OREPLACE (Targeting_Region, 'targ=!', '')) > 0 THEN 1 ELSE 0 END
      

      【讨论】:

        猜你喜欢
        • 2011-03-16
        • 2013-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多