我目前正在使用一组动态关键字来查询Redshift,我使用类似于模糊匹配的一系列OR语句返回这些关键字。
SELECT * FROM blah WHERE key LIKE '%bob%' OR key LIKE '%sid%'
这很好用但是我现在需要返回一个包含已匹配的source关键字的附加列。 e.g。
key matched
bobby bob
bobb bob
sidney sid
side sid
我能想到的唯一解决方案是关键词临时表和LEFT JOIN,但想知道是否有更好的方法?
答案 0 :(得分:0)
这是你要的吗?
SELECT key,
(case when key like '%bob%' then 'bob' else 'sid') as Matched
FROM
blah
WHERE
key LIKE '%bob%'
OR key LIKE '%sid%'
这些'bob'可以输入。
如果在存储过程中:
(case when key like '%@input1%' then @input1 else @input2) as Matched
如果直接从代码传递(我会假设c#)(不推荐,但只是为了理解):
"(case when key like '%"+input1+"%' then "+input1+" else "+input2+") as Matched"
答案 1 :(得分:0)
您可以将列表存储在子查询中并执行连接而不是OR:
$('body').on('click', '#gtco-offcanvas ul a:not([class="external"]),
.main-nav a:not([class="external"])
确实,你提到了......除了标量UDF之外,我无法想到另一种方式
答案 2 :(得分:0)
更新:如果您有第二个具有匹配值的表,那么这可能更符合您的要求。这将为“b”中与多个键选择器匹配的行提供多个结果。
SELECT b.*, k.matched
FROM blah b
JOIN keys k on STRPOS(b.key, k.matched) != 0
另一种可能过于简单且不具有表现力的可能性:
SELECT *,
case
when key LIKE '%bob%' then 'bob'
when key LIKE '%sid%' then 'sid'
end as matched
FROM blah
WHERE key LIKE '%bob%' OR key LIKE '%sid%'