Разделить строку на основе таблицы значений - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь написать запрос SQL, в котором мне нужно разделить строковое значение на основе списка значений, существующих в справочной таблице.

Например, у меня есть строковое значение "JOHN DOE SILVER" "и значение" JOHN "присутствует в справочной таблице, я хочу получить" JOHN "в результате.

В справочной таблице есть только один столбец со всеми значениями, которые можно найти в строка. Значение всегда находится в начале строки. У меня могут быть пробелы в значении, например:

String = "EXAMPLE STRING TEST"

Значение в справочной таблице = "EXAMPLE STRING "

Результат должен быть =" ПРИМЕРНАЯ СТРОКА "

Я не уверен, как я могу это сделать ... Я думаю, что сначала мне нужно разбить строку на основе на "если значение в его начале присутствует в справочной таблице" ... но я не знаю, как.

Я надеюсь, что это достаточно ясно, чтобы кто-то мог помочь мне в этом!

Edit :

, поскольку это кажется недостаточно ясным, я пытаюсь уточнить.

Фактически мне нужно заполнить столбец в my_table значением из reference_table , когда он найден в начале «тестовой строки» my_table. См. http://sqlfiddle.com/#! 4 / cbd72 / 1 для попытки проверить ваши ответы

Примечания:

  • Я могу иметь аналогичные значения в справочной таблице и Мне нужно взять самое длинное ("CHEMIN RURAL" против "CHEMIN", например)
  • Если значение не найдено, то в заполненном столбце нет значения (например, соединение слева в my_table)
  • строка для поиска всегда в начале строки в my_table

Ответы [ 5 ]

3 голосов
/ 31 января 2020

Вы можете использовать функцию INSTR в соединении следующим образом:

Select r.str
  From your_table t
  Join ref_table r
    On INSTR(t.your_column,r.str) = 1

Cheers !!

2 голосов
/ 02 февраля 2020

Первая проблема, которую я вижу, состоит в том, что вы хотите, чтобы «Рут» соответствовала «Рут Миллер», а не «Безжалостный Джон Браун». Т.е. строка поиска должна либо заканчиваться строкой, либо заканчиваться пробелом.

Вторая проблема может быть в нескольких совпадениях, например, «Джон Боб Миллер», найденный через «Джон Боб» и «Джон». Достаточно показать одно совпадение, т.е. лучшую (более длинную) строку. Такое ранжирование может быть сделано с ROW_NUMBER.

С LIKE:

select *
from
(
  select
    t.*, r.typeref,
    row_number() over (partition by t.nom order by length(r.typeref) desc) as rn
  from test t
  left join reference_table r on t.nom = r.typeref or t.nom like r.typeref || ' %'
)
where rn = 1;

Демо: http://sqlfiddle.com/#! 4 / cbd72 / 52

Вместо REGEXP_LIKE:

select *
from
(
  select
    t.*, r.typeref,
    row_number() over (partition by t.nom order by length(r.typeref) desc) as rn
  from test t
  left join reference_table r on regexp_like(t.nom, '^' || r.typeref || '[ $]')
)
where rn = 1;

Демонстрация: http://sqlfiddle.com/#! 4 / cbd72 / 51

2 голосов
/ 31 января 2020

Вот как вы можете сделать это в соединении.

-- sample data
with my_table as (select 'EXAMPLE STRING TEST' as str_value from dual union select 'JOHN DOE SILVER' from dual),
     reference_table as (select 'EXAMPLE STRING' as str_value from dual union select 'JOHN' from dual)
-- query
select ref.str_value
from my_table m
join reference_table ref
  on m.str_value like ref.str_value || '%'
1 голос
/ 31 января 2020

Вы можете попробовать ниже -

SELECT *
FROM REFERENCED_TABLE
WHERE 'EXAMPLE STRING' LIKE '%' || COLUMN_VALUES || '%'
0 голосов
/ 31 января 2020

ОБНОВЛЕНО

Этого можно добиться, используя window functions

select distinct 
          t.*
         ,max(r.typeref) over (partition by t.nom order by length(r.typeref) desc) as typeref
from my_table t
left join reference_table r on instr(t.nom,r.typeref)=1;

DEMO

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