人员查询的时候,输入多个人员姓名查询,想把查询的结果按照人名输入的顺序显示(sqlserver、mysql、Oracle、pgsql下的自定义排序)。

由于业务需求客户提出在进行多个人员姓名查询时,想把查询的结果按照人名输入的顺序显示。

开始是打算对查出来的数据进行二次处理重新排序,但是由于数据量大,查询必需要分页查询,这样一来,二次处理显然不是一个明智的方式。这种情况下只能从数据库入手,对于长期使用框架的人来说着实有点难度。

多方查找资料得出以下几种方式均可以实现该目的,由于项目环境,项目中使用的也是第四种方式,所以第四种也介绍的最详细。

一、PostgreSQL中使用ARRAY和unnest函数结合WITH ORDINALITY

在PostgreSQL中,有一种更简洁的方法来按照输入的人员姓名列表顺序显示查询结果,可 口 山 以使用、ARRAY、和unnest函数结合WITH ORDINALITY。以下是一个更简洁的示例:
 

SELECT p.*
FROM people p
JOIN unnest(ARRAY['张三','李四','王武','赵六']) WITH ORDINALITY AS t(name, ord) ON p.person_name = t.name
ORDER BY t.ord;


这个查询使用“unnest函数来展开输入的人员姓名数组,同时使用·WITH ORDINALITY·为每个元素分配一个序号。然后,它将展开的姓名与“people’表中的姓名进行匹配,并按照序号·ord’来排序结果
这种方法更简洁,不需要子查询.,但仍然实现了按照输入顺序排序的效果。请根据你的数据库架构和表结构进行适当的调整。

二、sqlserver、mysql、Oracle、pgsql中使用ORDER BY子句结合CASE·表达式

假设有一个名为people的表:

SELECT *
FROM people
WHERE person_name IN ('张三','李斯','王武','赵六')    --输入的人员姓名序列
ORDER BY
CASE person_name
WHEN '张三' THEN 1
WHEN '李斯' THEN 2
WHEN '王武' THEN 3
WHEN '赵六' THEN 4
ELSE 5    --如果有其他人员不在列表中,可以将其放在未尾
END;


上述SQL查询首先使用WHERE·子句来筛选包含在输入的人员姓名列表中的记录,然后使用ORDER BY子句结合CASE·表达式,将结果按照你输入的姓名的顺序进行排序。每个姓名都有一个对应的权重,以确保它们按照指定的顺序显示。

可以根据实际情况修改查询中的表名、列名和姓名列表,以适应你的数据库架构和数据。

这个语句对于不同数据库的兼容性较大,亲测:sqlserver、mysql、Oracle、pgsql
 

三、mysql中使用FIELD函数

如果你想要根据输入的多个人员姓名的顺序显示查询结果,而不使用·CASE·表达式,那么通常情况下,你需要在输入姓名的时候,将它们与权重或排序值一起传递到SQL查询中。这样可以让数据库按照指定的顺序进行排序。以下是一个示例SQL查询:

SELECT * 
FROM people
WHERE person_name IN ('张三','李四','王武','赵六')
ORDER BY
FIELD(person_name,'张三','李四','王武','赵六');


上SQL查询使用了MySQL中的FIELD函数,它会返回在第一个参数 (在这里是person_name列)中匹配指定值的位置,然后将结果按照这些位置进行排序。这会根据输入的人员姓名的顺序返回结果。
请注意,上述示例使用了MySQL中的“FIELD函数。如果你使用的是不同的数据库系统,可能需要根据该数据库系统的函数和语法进行相应的调整。不同的数据库系统可能会有不同的函数来实现类似的功能。

四、在 PostgreSQL使用array_position函数

简单的例子:

SELECT *
FROM people
WHERE person_name  IN('张三','李四','王武','赵六')
ORDER BY array_position(array['张三','李四','王武','赵六'],person_name);

在上面的查询中, array_position 函数用于获取每个姓名在输入数组中的位置,然后使用 ORDER BY 子句按照这个位置进行排序。

项目中实际代码:

SELECT *
FROM people
WHERE person_nameIN('张三','李四','王武','赵六')
ORDER BY 
array_position(array['张三','李四','王武','赵六'],CAST ( REPLACE ( REPLACE ( person_name, ' ', '' ), ' ', '' ) AS TEXT));

解析下array_position的第二个参数为什么为这么复杂:

(1)数据库中存入的姓名两个字的名字中间会有一个全角或半角空格,考虑到用户查询时不会输入空格的情况所以使用两个嵌套的REPLACE 函数过滤掉数据库中的全角和半角空格;

(2)使用CAST函数进行将varchar转换成text格式的原因是第一个参数“ array['张三','李四','王武','赵六'] ”,在pg中认为是text[]类型所以,参数二的数据类型应为text,否则会报错,如图:

array_position函数的具体用法可以参考 :PostgreSQL array_position() 函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值