Sql 按最佳匹配排序,然后按名称排序
我想要一个类似于查询的SQLSql 按最佳匹配排序,然后按名称排序,sql,db2,db2-luw,Sql,Db2,Db2 Luw,我想要一个类似于查询的SQL,并且结果以输入参数开头,然后按字母顺序排序 所以如果我有 Foobbb aaafoo Fooaaa bFoob cccfooccc 我搜索foo,我希望它排序为: Fooaaa Foobbb aaafoo bFoob cccfooccc 因此,我最相关的项目是第一。想要一个清晰易懂的好方法来做到这一点吗?我可以创建一个临时表,但觉得开销太大了 我试过了 DECLARE cemployer CURSOR WITH RETURN FOR SELECT employe
,并且结果以输入参数开头,然后按字母顺序排序
所以如果我有
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查询上放置distinct。我知道我可以通过使用substring、locate或其他字符串函数来解决这个问题,但我想知道最优雅的方法来解决这个问题,并确保不会返回复制品。一般方法
ORDER BY CASE WHEN col like 'foo%' THEN 1 ELSE 2 END,col
一般方法
ORDER BY CASE WHEN col like 'foo%' THEN 1 ELSE 2 END,col
问题是雇员匹配两个组,而您只需要第一个匹配。解决此问题的一种方法是通过以下方式将查询更改为组:
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;
这是一种非常简单的修复方法,无需修改定义每个组的逻辑。问题在于,员工匹配两个组,而您只需要第一个匹配。解决此问题的一种方法是通过以下方式将查询更改为组:
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;
这是一种非常简单的修复方法,不需要修改定义每个组的逻辑。谢谢您的回答,但是我选择了@Madhivanan-answer,因为SQL更短,更容易阅读。加上你的答案是0.36秒,他的答案是0.31秒。答案不错,但是我选择了@Madhivanan答案,因为SQL更短,更容易阅读。加上你的跑0.36秒,他的跑0.31秒