我有一个类似下面的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的东西,但经过大量的搜索后我一直无法找到它的好解释。
谢谢!
答案 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