我正在搜索一个大型数据库,查找长度在5-7个字符之间的单词列表。到目前为止,我已经做到了:
Select *
from sometable
Where upper("Description") like any ("%ABC_123%", "%ABC_124%", "%DE_25%")我还想返回在查询中找到的单词,但我无法在不复制subtr函数中的单词列表的情况下做到这一点。
可能有一种更好的方法来做这件事,我希望能得到一些指导。
发布于 2014-03-04 20:29:32
正如Rob Paller已经提到的,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发布于 2012-09-25 23:33:49
您是否尝试过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);发布于 2019-01-02 19:09:00
四年后,但不管怎样...可以很好地使用LIKE join (并在多个匹配的情况下进行限定)
例如:
SELECT a.orig_pattern
,b.my_keyword
FROM table_with_data a
JOIN table_with_keywords b
ON a.orig_pattern LIKE '%'||b.my_keyword||'%'
QUALIFY row_number() OVER (partition by orig_pattern ORDER by orig_pattern) = 1https://stackoverflow.com/questions/12586193
复制相似问题