根据值表分割字串

时间:2020-01-31 15:39:21

标签: sql oracle

我正在尝试编写一个SQL查询,其中我需要根据参考表中存在的值列表来拆分字符串值。

例如,我有字符串值“ JOHN DOE SILVER”,并且引用表中存在值“ JOHN”,因此我想获取“ JOHN”。

在参考表中,只有一列包含可在字符串中找到的所有值。 该值始终位于字符串的开头。 我可以在值中留空格,例如:

字符串 =“示例字符串测试”

参考表中的值 =“示例字符串”

结果应为 =“示例字符串”

我不确定该怎么做... 我想我首先需要根据“如果引用表中存在开头的值”来分割字符串,但是我不知道如何。

我希望它很清楚,以便有人可以帮助我!

编辑

由于似乎不够清晰,我尝试指定。

实际上,当在my_table的“测试字符串”开头时,我需要用 reference_table 中的值填充 my_table 中的列。请参见http://sqlfiddle.com/#!4/cbd72/1,以测试您的答案

注意:

  • 我在参考表中可以有类似的值,并且我需要取最长的值(例如,“ CHEMIN RURAL”和“ CHEMIN”)
  • 如果没有找到值,则填充的列中没有值(例如,在my_table上左连接)
  • 要找到的字符串总是在my_table中的字符串开头

5 个答案:

答案 0 :(得分:3)

您可以在联接中使用INSTR函数,如下所示:

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

干杯!

答案 1 :(得分:2)

这就是您如何在联接中做到这一点。

-- 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 || '%'

答案 2 :(得分:2)

我看到的第一个问题是您希望'Ruth'匹配'Ruth Miller',而不是'Ruthless John Brown'。即搜索字符串必须在字符串末尾或后跟一个空格。

第二个问题可能是多个匹配项,例如通过“ John Bob”和“ John”找到的“ John Bob Miller”。足以显示一个匹配项,即更好(更长)的字符串。可以使用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

答案 3 :(得分:1)

您可以在下面尝试-

SELECT *
FROM REFERENCED_TABLE
WHERE 'EXAMPLE STRING' LIKE '%' || COLUMN_VALUES || '%'

答案 4 :(得分:0)

已更新

您可以使用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

相关问题