Итеративный поиск сгустка Teradata - PullRequest
0 голосов
/ 24 октября 2019

У нас есть номер счета, хранящийся в поле Clob таблицы ... мы назовем его tbl_accountdetail. Мне нужно отозвать все записи из tbl_accountdetail, если номера счетов указаны в результатах другого запроса ... мы назовем это sourcequery.

Я могу сделать это индивидуально для каждого номера счета с помощью:

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

Естественно, моей первой мыслью было создание курсора и просмотр каждого номера счета изsourcequery.

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. Может ли кто-нибудь помочь мне с лучшим способом поиска сгустка? И сделать это для списка значений?

Любая помощь / предложения с благодарностью.

1 Ответ

0 голосов
/ 24 октября 2019

Как структурированы ваши CLOB данные? Сохранено ли поле accountnumber таким образом, что вы можете извлечь его с помощью шаблона поиска - например, accountnumber=<10-digit-#>?

Если вы хотите искать несколько значений accountnumber, то я думаю, что лучший способзаключается в извлечении значений accountnumber из каждого CLOB и последующем поиске по ним. Что-то вроде:

SELECT * 
FROM Tbl_accountdetail 
WHERE <extracted_accountnumber> IN (
  SELECT account_number
  FROM account_table
)

Вы правы, что курсоры используются только в хранимых процедурах. Основная цель для них состоит в том, чтобы обработать каждую строку набора результатов по отдельности и выполнить любую дополнительную логику, которая, как вам кажется, вам не нужна в вашем случае. Вы можете поместить SQL в макрос или просто запустить его как есть.

Обновить
Предполагая, что в вашем поле CLOB имеется только одно значение accountnumс форматом "accountnum": "123456789" вы должны иметь возможность сделать что-то вроде этого:

SELECT * 
FROM Tbl_accountdetail 
WHERE REGEXP_SUBSTR(myclob, '"accountnum":\s+"([0-9]+)"', 1, 1, NULL) IN (
  SELECT account_number
  FROM account_table
)

Это должно извлечь первое совпадение accountnumber в вашем поле CLOB и посмотреть, существует ли это значение вподзапрос IN.

У меня нет системы TD для тестирования, поэтому вам может понадобиться немного поиграться с аргументами. Просто замените myclob именем поля CLOB и обновите подзапрос в IN(). Попробуйте и дайте мне знать.

SQL Fiddle (Oracle)
Regexp Tester
Teradata - REGEXP_SUBSTR

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...