我正在尝试编写一个SQL查询,其中我需要根据参考表中存在的值列表来拆分字符串值。
例如,我有字符串值“ JOHN DOE SILVER”,并且引用表中存在值“ JOHN”,因此我想获取“ JOHN”。
在参考表中,只有一列包含可在字符串中找到的所有值。 该值始终位于字符串的开头。 我可以在值中留空格,例如:
字符串 =“示例字符串测试”
参考表中的值 =“示例字符串”
结果应为 =“示例字符串”
我不确定该怎么做... 我想我首先需要根据“如果引用表中存在开头的值”来分割字符串,但是我不知道如何。
我希望它很清楚,以便有人可以帮助我!
编辑:
由于似乎不够清晰,我尝试指定。
实际上,当在my_table的“测试字符串”开头时,我需要用 reference_table 中的值填充 my_table 中的列。请参见http://sqlfiddle.com/#!4/cbd72/1,以测试您的答案
注意:
答案 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;
答案 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;