首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Teradata存根的迭代搜索

Teradata存根的迭代搜索
EN

Stack Overflow用户
提问于 2019-10-24 05:55:32
回答 1查看 234关注 0票数 0

我们有一个帐号存储在表的Clob字段中……我们称它为tbl_accountdetail。如果帐号在另一个查询的结果中,我需要从tbl_accountdetail中拉回所有记录...我们称之为sourcequery。

我可以使用以下命令分别为每个帐号执行此操作:

Select * from Tbl_accountdetail where REGEXP_INSTR(CLOB,'accountnumber')>0

很自然,我的第一个想法是做一个游标并循环通过来自源查询的每个帐号。

代码语言:javascript
复制
Declare @accountnumber varchar(30)

Declare Err_Cursor Cursor for 
Select accountnumber from ErrorTable; 

Open Err_Cursor;
Fetch next from Err_Cursor into @accountnumber;
While @@Fetch_status = 0
Begin
    Select * from Tbl_accountdetail where REGEXP_INSTR(CLOB,@accountnumber)>0
    Fetch next from Err_Cursor into @accountnumber
End; 

Close Err_Cursor;
Deallocate Err_Cursor;

我读得越多,我就越困惑于获得我想要的结果的最佳/最有效的方法。

对游标的引用似乎都需要将它们包含在存储过程中,并且基于简单性,您不会认为这需要添加到sp中。对宏的引用似乎都是需要更新/插入的宏,这些我不需要。我所要做的就是从Tbl_accountdetail返回账号在clob中的行。

我是Teradata和Clobs的新手。有没有人能帮我找到最好的搜索方法?并为一列值执行此操作?

非常感谢您的任何帮助/建议。

EN

回答 1

Stack Overflow用户

发布于 2019-10-24 14:11:03

您的CLOB数据是如何构造的?accountnumber字段的存储方式是否可以使用可搜索模式(即accountnumber=<10-digit-#> )来提取它

如果您想搜索多个accountnumber值,那么我认为最好的方法是从每个CLOB中提取accountnumber值,然后对其进行搜索。类似于:

代码语言:javascript
复制
SELECT * 
FROM Tbl_accountdetail 
WHERE <extracted_accountnumber> IN (
  SELECT account_number
  FROM account_table
)

您说得对,游标只在存储过程中使用。它们的主要用途是单独处理结果集的每一行,并执行任何其他逻辑,这些逻辑在您的示例中似乎并不需要。您可以将SQL放入宏中,也可以直接按原样运行它。

更新

假设您的CLOB字段中只有一个格式为"accountnum": "123456789"accountnum值,您应该能够执行以下操作:

代码语言:javascript
复制
SELECT * 
FROM Tbl_accountdetail 
WHERE REGEXP_SUBSTR(myclob, '"accountnum":\s+"([0-9]+)"', 1, 1, NULL) IN (
  SELECT account_number
  FROM account_table
)

这将提取CLOB字段中的第一个accountnumber匹配,并查看该值是否也存在于IN子查询中。

我没有可以测试的TD系统,所以您可能需要稍微修改一下参数。只需将myclob替换为CLOB字段的名称,并在IN()中更新子查询即可。试一试,让我知道。

SQL Fiddle (Oracle)

Regexp Tester

Teradata - REGEXP_SUBSTR

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58531481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档