Определите последнее вхождение подстроки в строке, где подстрока из таблицы.Teradata - PullRequest
0 голосов
/ 25 июня 2018

У меня следующая проблема:

Мне нужно идентифицировать последнее вхождение любой подстроки, приведенной в таблице A, и вернуть это заданное значение в ответ в операторе выбора другого оператора.Это немного запутанно, но вот код:

SELECT TRIM(COUNTRY_CODE)
FROM (
    SELECT TOP 1 POSITION( PHRASE IN MY_STRING) AS PHRASE_LOCATION, CODE 
    FROM REFERENCE_TABLE -- Where the country list is located
    WHERE PHRASE_LOCATION > 0 -- To return NULL if there is no matches
    ORDER BY 1 DESC -- To get the last one 
    ) t1

Это работает, когда запускается само собой, но у меня большие проблемы с его работой как часть выбора других запросов.Мне нужно, чтобы "MY_STRING" пришел с более высокого уровня во вложенной выборке три.Это объясняется тем, как система разработана на более высоком уровне.

Другими словами, мне нужно следующее:

  • PHRASE исходит из таблицы, в которой есть фразы и связанный код
  • MY_STRING используется на более высоком уровневыберите и мне нужно связать с ним код, основанный на последней фразе
  • Количество разных фраз> 400, поэтому не нужно жестко кодировать: (
  • Количество разных «MY_STRING»> 1 000000 / день

До сих пор я пробовал то, что вы видите выше, но из-за ограничений системы я не могу быть креативным.

Example Phrases: "New York", "London", "Oslo"
Example Codes: "US", "UK, "NO"
Example Strings: "London House, Something street, New York"; "Some street x, 0120, OSL0". 
Desired Outcomes: "US"; "NO"

1 Ответ

0 голосов
/ 26 июня 2018

Это приведет к объединению продуктов , то есть к использованию большого количества ЦП:

SELECT MY_STRING
  -- using INSTR searching the last occurance instead of POSITION if the same PHRASE might occur multiple times
  -- INSTR is case sensitive -> must use LOWER 
  ,Instr(Lower(MY_STRING), Lower(PHRASE), -1, 1) AS PHRASE_LOCATION
  ,CODE 
  ,PHRASE
FROM table_with_MY_STRING
LEFT JOIN REFERENCE_TABLE -- to return NULL if no match
ON PHRASE_LOCATION > 0
QUALIFY
   Row_Number() -- return last match
   Over (PARTITION BY MY_STRING
         ORDER BY PHRASE_LOCATION DESC) = 1

Если это недостаточно эффективно, другое возможное решение может использовать STRTOK_SPLIT_TO_TABLE / * 1007.*: разделите адрес на части, а затем соедините эти части в PHRASE.

...