我正在搜索大型數據庫以查找5-7個字符之間變化長度的單詞列表。 到目前爲止,我有:需要在Teradata SQL中根據單詞列表搜索文本字段並返回該單詞
Select *
from sometable
Where upper("Description") like any ("%ABC_123%", "%ABC_124%", "%DE_25%")
我想也返回了在查詢找到,但我堅持就如何做到不重複的subtr功能詞列表中的詞。
這樣做可能有更好的方法,我會欣賞一些方向。
我正在搜索大型數據庫以查找5-7個字符之間變化長度的單詞列表。 到目前爲止,我有:需要在Teradata SQL中根據單詞列表搜索文本字段並返回該單詞
Select *
from sometable
Where upper("Description") like any ("%ABC_123%", "%ABC_124%", "%DE_25%")
我想也返回了在查詢找到,但我堅持就如何做到不重複的subtr功能詞列表中的詞。
這樣做可能有更好的方法,我會欣賞一些方向。
正如羅布帕勒已經提到的有正則表達式中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
對於REGEX_SUBSTR示例爲+1。我在TD14中非常喜歡這個功能。 –
您是否試過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);
這是我希望避免的,我在218個單詞和計數。好的一面是,列表始終以ABC_或DE_開頭,並且在下劃線後面有2或3個數字。但我需要能夠完全返回DE_123或ABC_567。我可以完全跳過這個列表並使用通配符搜索...但是卡住了可變數量的字符問題。 – pedram
這是一個有趣的問題,我想到了其他方法可能會使這更合理的完成在一個基於SET的解決方案。光標會成爲簡單的解決方案,但性能/可擴展性成本。 –
增加了關於在LIKE謂詞中使用子查詢的更多細節。 –
要找到你也可以使用REGEXP行:
Select *
from sometable
Where Description REGEXP 'ABC_123|ABC_124|DE_25'
我的天堂」 t能夠找出你的B部分,返回找到的單詞,除非該單詞是說明字段中唯一的單詞。如果它是唯一的詞,您可以簡單地返回說明字段的內容。
我猜雙引號'「」%ABC_124%「'是錯誤的,我沒有在編輯以防萬一糾正。如果是。一個錯誤,編輯和更正 – Yaroslav