需要根据单词列表搜索TeradataSQL中的文本字段并返回该单词
我正在一个大型数据库中搜索长度在5-7个字符之间变化的单词列表。 到目前为止,我已经:需要根据单词列表搜索TeradataSQL中的文本字段并返回该单词,sql,search,text,full-text-search,teradata,Sql,Search,Text,Full Text Search,Teradata,我正在一个大型数据库中搜索长度在5-7个字符之间变化的单词列表。 到目前为止,我已经: Select * from sometable Where upper("Description") like any ("%ABC_123%", "%ABC_124%", "%DE_25%") 我还想返回在查询中找到的单词,但我一直在思考如何在不复制subtr函数中的单词列表的情况下执行此操作 可能有更好的方法可以做到这一点,我希望有一些指导。您是否尝试过位置功能和多个或条件 SELECT * FR
Select *
from sometable
Where upper("Description") like any ("%ABC_123%", "%ABC_124%", "%DE_25%")
我还想返回在查询中找到的单词,但我一直在思考如何在不复制subtr函数中的单词列表的情况下执行此操作
可能有更好的方法可以做到这一点,我希望有一些指导。您是否尝试过
位置
功能和多个或条件
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);
要查找行,还可以使用REGEXP:
Select *
from sometable
Where Description REGEXP 'ABC_123|ABC_124|DE_25'
我无法理解你的B部分,返回找到的单词,除非该单词是描述字段中唯一的单词。如果它是唯一的单词,您只需返回描述字段的内容。正如Rob Paller已经提到的,TD14中有正则表达式:
Select sometable.*,
REGEXP_SUBSTR(Description,'((ABC_)(123|124)|(DE_(25)))') AS match
from sometable
Where match <> '';
4年后,但无论如何。。。与LIKE join配合使用效果很好(如果存在多个匹配项,则可进行限定)
e、 g
我猜双引号“”%ABC\u 124%“
是一个错误,我没有在编辑中更正,以防万一。如果是错误,请编辑并更正。这是我希望避免的。我的字数是218个单词。有利的一面是,列表总是以ABC_uu或DE_u开头,下划线后有2或3个数字。但我需要能够准确返回DE_123或ABC_567。我可以完全跳过列表,使用通配符搜索……但我一直被可变字符数的问题困扰着。这是一个有趣的问题,让我想到了其他方法,这些方法可能会使在基于集合的解决方案中实现这一点更加合理。游标可能是一个简单的解决方法,但要以性能/可伸缩性为代价。添加了关于使用带有LIKE谓词的子查询的更多详细信息。对于REGEX_SUBSTR示例,使用+1。在TD14中,我已经非常喜欢这个功能。
REGEXP_SUBSTR(Description,'(ABC_|DE_)([0-9]{2,3})') AS match
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) = 1