按名称排序最佳匹配

时间:2012-08-21 13:37:20

标签: sql db2 db2-luw

我想要一个SQL like查询,并且结果以首先排序的输入参数开始,结果的其余部分将按字母顺序排序。

所以,如果我有

Foobbb
aaafoo
Fooaaa
bFoob
cccfooccc

我搜索foo我希望它排序为:

Fooaaa
Foobbb
aaafoo
bFoob
cccfooccc

所以我最相关的项目是第一位的。想要清楚地理解和良好的表现方式吗?我可以创建一个临时表,但认为它太多了。

我试过

DECLARE cemployer CURSOR
WITH RETURN
FOR SELECT employer
    FROM   ((SELECT employer_name,  1 AS grp
             FROM   employer e
             WHERE  Upper(employer_name) LIKE Upper(i_employer|| '%'))
            UNION
            (SELECT employer_name, 2   AS grp
             FROM   employer e
             WHERE  Upper(employer_name) LIKE Upper('%'||i_employer|| '%')))
    ORDER  BY grp,
              employer;

OPEN cemployer;  

然而,当我这样做时,我得到了

Fooaaa
Foobbb

在结果集的底部再次重复。 DB2不允许我对outter查询进行区分。我知道我可以通过子串或定位或其他字符串函数以多种方式解决这个问题,但想知道最强优雅的方法,并确保不返回重复项。

2 个答案:

答案 0 :(得分:7)

一般方法

ORDER BY CASE WHEN col like 'foo%' THEN 1 ELSE 2 END,col

答案 1 :(得分:1)

问题是,一个emplyer匹配两个组,你只想要第一个匹配。解决此问题的一种方法是通过以下方式将查询更改为组:

SELECT employer
FROM   ((SELECT employer_name,  1 AS grp
         FROM   employer e
         WHERE  Upper(employer_name) LIKE Upper(i_employer|| '%')
        )  UNION
        (SELECT employer_name, 2   AS grp
         FROM   employer e
         WHERE  Upper(employer_name) LIKE Upper('%'||i_employer|| '%')
        )
       )
group by employer
ORDER  BY min(grp), employer; 

这是一种非常简单的方法来解决它,而不是摆弄定义每个组的逻辑。

相关问题