sql怎么实现线性排序

我最近偶然发现了一个有趣的Stack Overflow问题 ,该问题本质上是用户希望确保以明确定义的顺序交付结果记录。

他们写

SELECT name
FROM product
WHERE name IN ('CE367FAACDHCANPH-151556','CE367FAACEX9ANPH-153877','NI564FAACJSFANPH-162605','GE526OTACCD3ANPH-149839')

他们得到了

CE367FAACDHCANPH-151556
CE367FAACEX9ANPH-153877
GE526OTACCD3ANPH-149839
NI564FAACJSFANPH-162605

他们想

CE367FAACDHCANPH-151556
CE367FAACEX9ANPH-153877
NI564FAACJSFANPH-162605
GE526OTACCD3ANPH-149839

通常,根据您的业务规则,排序顺序不是“自然”的,就像在数字排序或字母数字排序中一样。 一些业务规则可能指定了GE526OTACCD3ANPH-149839需要出现在列表的最后。 或者,用户可能已经通过拖放在屏幕上重新排列了产品名称,从而产生了新的排序顺序。

当然,我们可以讨论是否应该在UI层中执行这种排序,但是让我们假设要在数据库中完成这种排序所需的业务案例或性能要求或通用体系结构。 怎么做? 通过…

排序间接

实际上,您不想按产品名称排序,而是按此类名称的预定义枚举排序。 换句话说,您需要这样的功能:

CE367FAACDHCANPH-151556 -> 1
CE367FAACEX9ANPH-153877 -> 2
NI564FAACJSFANPH-162605 -> 3
GE526OTACCD3ANPH-149839 -> 4

使用普通SQL,有许多方法可以完成上述操作。 这是其中两个( 也可以在我的Stack Overflow答案中看到 ):

通过使用CASE表达式

您可以使用ORDER BY子句中的CASE表达式轻松地告诉数据库显式排序间接CASE

SELECT name
FROM product
WHERE name IN ('CE367FAACDHCANPH-151556','CE367FAACEX9ANPH-153877','NI564FAACJSFANPH-162605','GE526OTACCD3ANPH-149839')
ORDER BY CASE WHEN name = 'CE367FAACDHCANPH-151556' THEN 1WHEN name = 'CE367FAACEX9ANPH-153877' THEN 2WHEN name = 'NI564FAACJSFANPH-162605' THEN 3WHEN name = 'GE526OTACCD3ANPH-149839' THEN 4END

请注意,我使用了CASE WHEN predicate THEN value END语法,因为这在所有SQL方言中都已实现。 另外, 如果您不使用Apache Derb y,也可以在键入,书写时保存一些字符:

ORDER BY CASE name WHEN 'CE367FAACDHCANPH-151556' THEN 1WHEN 'CE367FAACEX9ANPH-153877' THEN 2WHEN 'NI564FAACJSFANPH-162605' THEN 3WHEN 'GE526OTACCD3ANPH-149839' THEN 4END

当然,这需要在谓词和间接排序中重复相同的值。 这就是为什么在某些情况下您可能会更幸运的原因……

通过使用INNER JOIN

在以下示例中,在一个简单的派生表中处理了谓词和排序间接寻址,该表是原始查询的INNER JOIN

SELECT product.name
FROM product
JOIN (VALUES('CE367FAACDHCANPH-151556', 1),('CE367FAACEX9ANPH-153877', 2),('NI564FAACJSFANPH-162605', 3),('GE526OTACCD3ANPH-149839', 4)
) AS sort (name, sort)
ON product.name = sort.name
ORDER BY sort.sort

上面的示例使用PostgreSQL语法,但是您可以在数据库中以不同的方式实现相同的功能。

使用jOOQ的排序间接API

编写排序间接寻址有点麻烦 ,这就是为什么jOOQ对于这种用例具有特殊的语法的原因,该语法也记录在手册中 。 以下任何语句的执行与上述查询相同:

// jOOQ generates 1, 2, 3, 4 as values in the
// generated CASE expression
DSL.using(configuration).select(PRODUCT.NAME).from(PRODUCT).where(NAME.in("CE367FAACDHCANPH-151556","CE367FAACEX9ANPH-153877","NI564FAACJSFANPH-162605","GE526OTACCD3ANPH-149839")).orderBy(PRODUCT.NAME.sortAsc("CE367FAACDHCANPH-151556","CE367FAACEX9ANPH-153877","NI564FAACJSFANPH-162605","GE526OTACCD3ANPH-149839")).fetch();// You can choose your own indirection values to
// be generated in the CASE expression.orderBy(PRODUCT.NAME.sort(new HashMap<String, Integer>() {{put("CE367FAACDHCANPH-151556", 2);put("CE367FAACEX9ANPH-153877", 3);put("NI564FAACJSFANPH-162605", 5);put("GE526OTACCD3ANPH-149839", 8);}}))

结论

间接排序是一个时不时放松的好方法。 永远不要忘记,您可以在SQL语句的ORDER BY子句中放置几乎任意的列表达式。 使用它们!

翻译自: https://www.javacodegeeks.com/2014/05/how-to-implement-sort-indirection-in-sql.html

sql怎么实现线性排序

sql怎么实现线性排序_如何在SQL中实现排序间接相关推荐

  1. python列表内数字排序_如何在Python中手动排序数字列表?

    规格:Ubuntu 13.04,Python 3.3.1 背景:Python的初学者,遇到了这个"手动排序"的问题. 我被要求做的是:"让用户输入3个数值并将它们存储在3 ...

  2. python set 排序_python set 排序_如何在Python中使用sorted()和sort()

    点击"蓝字"关注我们 ?"Python基础知识" 大卫·丰达科夫斯基  著 18财税3班 李潇潇    译 日期:2019年5月6日 一. 使用sorted() ...

  3. mysql 自然排序_如何在mysql中实现自然排序

    背景 熟悉mysql的同学应该清楚,mysql在对字符串做order by排序时是按照字典序进行排序的,但是如果字符串中包含数字的话(我们称这种类型的字符串为alphanumeric),仅按照字典序的 ...

  4. python sort 多级排序_为什么在python中使用排序功能进行多级排序...

    这篇文章与How do I sort a list of dictionaries by values of the dictionary in Python?不同,我认为无法使用lambda sor ...

  5. mysql按域排序_如何在MySQL中对域名进行排序?

    要对域名进行排序,请使用ORDER BY SUBSTRING_INDEX().让我们首先创建一个表-mysql> create table DemoTable670(DomainName tex ...

  6. [转载] java中对数组进行排序_如何在Java中对数组排序

    参考链接: Java中main()的有效变体 java中对数组进行排序 Java Array is like a container that can hold a fixed number of t ...

  7. java对列表数据排序_如何在Java中对列表进行排序

    java对列表数据排序 Sometimes we have to sort a list in Java before processing its elements. In this tutoria ...

  8. java中对数组进行排序_如何在Java中对数组排序

    java中对数组进行排序 Java Array is like a container that can hold a fixed number of the same type of items, ...

  9. java中按字母排序_如何在Java中按字母顺序对字符串进行排序

    使用toCharArray()方法 该类的toCharArray()方法将字符串转换为字符数组并返回它. 按字母顺序对字符串值进行排序获取所需的字符串. 使用toCharArray()方法将给定的字符 ...

最新文章

  1. Spring 和 SpringBoot 比较,解惑区别!
  2. consul 日志配置_Go语言微服务架构实战:第十一节 启动Consul
  3. Python笔记-字符串转json
  4. 【工具】Get Data-获取论文图片中数据的工具
  5. ffmpeg源码简析(八)解码 av_read_frame(),avcodec_decode_video2(),avformat_close_input()
  6. 二种方法js实现轮播图自动切换
  7. 如何用谷歌地图下载器下载大字体谷歌地图打印喷绘
  8. java中XML转JSON、JSON转XML、XML转对象(Object)、对象(Object)转XML,利用XSD验证XML(手把手教你如何接收、处理、验证XML数据)
  9. iphone6 计算机无法检测到照相机,iphone6手机照相不聚焦
  10. 流殇三月,誓言碎落于天涯
  11. 网页实现语音对讲_通过基于WebRTC的浏览器实现语音通话的方法及系统的制作方法...
  12. 高冷一字id_一个字网名 高冷一字id
  13. 一文详解SQL关联子查询
  14. Sam版Matlab粒子群PSO工具已经更新
  15. 5个超棒的自我提升App
  16. 【西祠日志】【19】【20】有人说,21天可以养一种习惯
  17. 关于进制计算的公式(转换为十进制)
  18. GPL LGPL M.
  19. js 驼峰转下划线
  20. 从2018年以太坊统计数据看区块链发展趋势

热门文章

  1. 【笔记】2022.5.9 网页数据收集
  2. python是汇编语言吗-汇编语言最新资讯
  3. Fluent UDF 根据给定点坐标获取cell
  4. 相机技术--监控摄像机焦距与视角(视场大小)的具体选择
  5. Gephi学习笔记-画出图形基本流程
  6. python学习笔记P41-47
  7. 尼尔机械纪元安卓机器人_尼尔机械纪元手机版
  8. CTF-SMB信息泄露【简单易懂】
  9. HTML如何给网页添加ico图标?
  10. ubuntu-安装Wine