重新调整或查询

时间:2018-02-22 08:27:46

标签: sql amazon-redshift

我目前正在使用一组动态关键字来查询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,但想知道是否有更好的方法?

3 个答案:

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