我们有一个帐号存储在表的Clob字段中……我们称它为tbl_accountdetail。如果帐号在另一个查询的结果中,我需要从tbl_accountdetail中拉回所有记录...我们称之为sourcequery。
我可以使用以下命令分别为每个帐号执行此操作:
Select * from Tbl_accountdetail where REGEXP_INSTR(CLOB,'accountnumber')>0
很自然,我的第一个想法是做一个游标并循环通过来自源查询的每个帐号。
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的新手。有没有人能帮我找到最好的搜索方法?并为一列值执行此操作?
非常感谢您的任何帮助/建议。
发布于 2019-10-24 14:11:03
您的CLOB数据是如何构造的?accountnumber字段的存储方式是否可以使用可搜索模式(即accountnumber=<10-digit-#> )来提取它
如果您想搜索多个accountnumber值,那么我认为最好的方法是从每个CLOB中提取accountnumber值,然后对其进行搜索。类似于:
SELECT *
FROM Tbl_accountdetail
WHERE <extracted_accountnumber> IN (
SELECT account_number
FROM account_table
)您说得对,游标只在存储过程中使用。它们的主要用途是单独处理结果集的每一行,并执行任何其他逻辑,这些逻辑在您的示例中似乎并不需要。您可以将SQL放入宏中,也可以直接按原样运行它。
更新
假设您的CLOB字段中只有一个格式为"accountnum": "123456789"的accountnum值,您应该能够执行以下操作:
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)
https://stackoverflow.com/questions/58531481
复制相似问题