1

我想要一个 SQLlike查询,并让结果以输入参数开头,然后将结果的其余部分按字母顺序排序。

所以如果我有

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 不允许我对外部查询进行区分。我知道我可以通过执行 substring 或 locate 或其他字符串函数以多种方式解决此问题,但想知道最优雅的方法来执行此操作并确保不返回重复项。

4

2 回答 2

7

一般方法

ORDER BY CASE WHEN col like 'foo%' THEN 1 ELSE 2 END,col
于 2012-08-21T13:45:11.563 回答
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; 

这是一种非常简单的修复方法,无需摆弄定义每个组的逻辑。

于 2012-08-21T13:47:05.680 回答