喜欢/喜欢的替代方案?...正则表达式?

时间:2014-04-21 18:19:33

标签: sql regex teradata

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

Customer_ID | Targeting_Region

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

    34      | targ=Asia

    56      | targ=!EU

'!'表示'不等于'。例如,第1行中的客户想要定位欧盟,但不包括法国。

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

我遇到的问题是一个简单的案例陈述不起作用(据我所知)。我试过以下两个陈述:

(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的东西,但经过大量的搜索后我一直无法找到它的好解释。

谢谢!

3 个答案:

答案 0 :(得分:0)

也许不完全是你正在寻找的东西,但是如果你只想在有正目标且没有负目标的情况下只有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)

这样的事情会起作用吗?

(当REGEXP_INSTR(targeting_region,'targ = [A-Z,a-z]')= 0时的情况;然后0其他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()返回在字符串中找到模式的字符位置。这太过分了,因为你只想知道它是被发现还是没有被发现,但希望它有效,因为我找不到更简单的功能。

答案 2 :(得分:0)

如果我理解正确你想要 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