2012-09-25 34 views
2

我正在搜索大型數據庫以查找5-7個字符之間變化長度的單詞列表。 到目前爲止,我有:需要在Teradata SQL中根據單詞列表搜索文本字段並返回該單詞

Select * 
    from sometable 
Where upper("Description") like any ("%ABC_123%", "%ABC_124%", "%DE_25%") 

我想也返回了在查詢找到,但我堅持就如何做到不重複的subtr功能詞列表中的詞。

這樣做可能有更好的方法,我會欣賞一些方向。

+0

我猜雙引號'「」%ABC_124%「'是錯誤的,我沒有在編輯以防萬一糾正。如果是。一個錯誤,編輯和更正 – Yaroslav

回答

4

正如羅布帕勒已經提到的有正則表達式中TD14:

Select sometable.*, 
     REGEXP_SUBSTR(Description,'((ABC_)(123|124)|(DE_(25)))') AS match 
    from sometable 
Where match <> ''; 

這應該是超過數百喜歡的更有效率。

此外,這可能被簡化,例如,如果你需要ABC_或DE_後跟任意兩個或三個數字:

 REGEXP_SUBSTR(Description,'(ABC_|DE_)([0-9]{2,3})') AS match 
+0

對於REGEX_SUBSTR示例爲+1。我在TD14中非常喜歡這個功能。 –

2

您是否試過POSITION函數和多個OR條件?

SELECT * 
FROM TABLE 
WHERE POSITION('ABC_123' IN UPPER("Description") > 0 
    OR POSITION('ABC_124' IN UPPER("Description") > 0 
    OR POSITION('DE_25' IN UPPER("Description") > 0; 

我認爲無論哪種方式,這將是一個昂貴的Teradata CPU/IO進程。我不知道Teradata 13.x或更早版本中的本機功能,這將有助於此。 Teradata 14.x(我認爲14.10)本來應該引入正則表達式支持,這可能會使這個解決方案更容易。

你在說什麼幾個單詞?

如果在LIKE謂詞中使用子查詢會怎樣?

SELECT * 
FROM myTable 
WHERE UPPER("Description") 
LIKE (SELECT ListWord 
     FROM myListWords); 

您可能必須讓你列表中的字詞出現在子查詢的模式:

SELECT * 
FROM myTable 
WHERE UPPER("Description") 
LIKE (SELECT '%' || ListWord || '%' AS ListWordPattern 
     FROM myListWords); 
+0

這是我希望避免的,我在218個單詞和計數。好的一面是,列表始終以ABC_或DE_開頭,並且在下劃線後面有2或3個數字。但我需要能夠完全返回DE_123或ABC_567。我可以完全跳過這個列表並使用通配符搜索...但是卡住了可變數量的字符問題。 – pedram

+0

這是一個有趣的問題,我想到了其他方法可能會使這更合理的完成在一個基於SET的解決方案。光標會成爲簡單的解決方案,但性能/可擴展性成本。 –

+0

增加了關於在LIKE謂詞中使用子查詢的更多細節。 –

0

要找到你也可以使用REGEXP行:

Select * 
from sometable 
Where Description REGEXP 'ABC_123|ABC_124|DE_25' 

我的天堂」 t能夠找出你的B部分,返回找到的單詞,除非該單詞是說明字段中唯一的單詞。如果它是唯一的詞,您可以簡單地返回說明字段的內容。

相關問題