2014-04-21 28 views
1

我有一個數據集TERADATA類似於如下: '!'替代喜歡/像任何?...正則表達式?

Customer_ID | Targeting_Region 

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

    34  | targ=Asia 

    56  | targ=!EU 

的表示'不等於'。例如,第一排的客戶想要瞄準歐盟,但排除法國。

我想創建一個標記(帶有'1')任何行的地方,有'積極'的目標。通過「積極」定位,我指的是某個特定區域被明確包含的任何行('負面'定位將是某個區域被明確排除的地方,比如法國排在第1行)。例如,第1行包含正面和負面的定位,第2行只包含正面定位,第3行只包含負面定位。

我遇到的問題是,一個簡單的case語句不會工作(據我所知)。我曾嘗試下面的語句2:

(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 

首屆上述聲明不起作用,因爲它會返回1兩個「TARG =」和「TARG =!

上面的第二條語句不起作用,因爲它只會返回1,只有正面定位的行。因此,第1行(上面)將返回0(我希望它返回1)

請注意,'targ ='後面的值也可以是數字。例如,'targ = 12345'

關於如何完成此任務的任何想法?我聽說Teradata有一種叫做regexp的東西,但經過一番搜索後,我一直無法找到它的一個很好的解釋。

謝謝!

回答

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 
+0

問題我得知的是,某些行將有一個積極和消極的目標。例如,請參閱我的原始帖子中的第1行。像這樣的一行將返回0與您的代碼,而我需要它返回1. 感謝您的迴應,但! – rahimftd

0

會是這樣的工作?

(情況下,當REGEXP_INSTR(targeting_region, 'TARG = [AZ,AZ]')= 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()返回在字符串中找到模式的字符位置。這太過分了,因爲你只是想知道它是否被發現或沒有,但希望它可以工作,因爲我找不到更簡單的功能。

0

如果我正確地理解了你,你想要如果有任何包含的目標,而不考慮附加的排除區域嗎?

此搜索 '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