Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按最佳匹配排序,然后按名称排序_Sql_Db2_Db2 Luw - Fatal编程技术网

Sql 按最佳匹配排序,然后按名称排序

Sql 按最佳匹配排序,然后按名称排序,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

我想要一个类似于查询的SQL
,并且结果以输入参数开头,然后按字母顺序排序

所以如果我有

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秒