SQL子命令由子串的一部分组成

时间:2014-02-12 21:48:12

标签: sql postgresql sql-order-by hql

我需要一些SQL查询创建方面的帮助。我有像

这样的数据
EN 771-2:2011
EN 197-1:2011
EN 295-1:2013
771-1:2011 
EN 54-24:2008
EN 492:2012
EN 54-25: 2008
EN 331:1998
EN 534:2006+A1:2010
EN 588-2:2001
EN 179:2008
EN 598:2007+A1:2009
EN 621:2009
EN 682: 2002

当订购结果为:

时,可以创建ORDER BY causule
EN 54-24:2008
EN 54-25: 2008
EN 179:2008
EN 197-1:2011
EN 295-1:2013
EN 331:1998
EN 492:2012
EN 534:2006+A1:2010
EN 588-2:2001
EN 598:2007+A1:2009
EN 621:2009
EN 682: 2002
771-1:2011 
EN 771-2:2011
分别是

,我需要顺序,这将取决于子串的一部分:

EN 54 - 24 :2008, EN 54 - 25 :2008, 771 - 1 :2011, EN 771 - 2 :2011

粗体字符应具有最高优先级,斜体字符应具有较低优先级。 是否有可能为这样的结果创建“ ORDER BY ”结果?我知道子串函数,但她给我的结果不同。

感谢您的帮助。

5 个答案:

答案 0 :(得分:1)

您必须通过正则表达式正式定义完全是“粗体”还是“斜体”。

如果您假设第一组数字是第一个要订购的变量,第二组是第二个:

ORDER BY substring(col,'\d+')::int, substring(col,'\d+[^\d]+(\d+)')::int;

或者,如果您的定义是第一个数字是第一个空格后面的数字,第二个数字是破折号后面的数字:

ORDER BY substring(col,' (\d+)')::int, substring(col,'-(\d+)')::int;

当然你应该首先调试这些购买运行select substring(...)

答案 1 :(得分:0)

是的,如你所说的子串,但是你必须将它转换为整数,以便使用数字顺序(这似乎是你想要的)。

未经测试,请按以下顺序尝试:

cast(substring(来自'\ s * \ d + - '的YOURFIELDNAME)作为整数)

它使用正则表达式:

\ s表示空格 *使其可选 \ d表示数字 +选择一个或多个数字 - 减号

答案 2 :(得分:0)

是的,试试这个。假设前2个字符始终为EN,则后跟3个数字和 -

select column_name from table_name order by   
substring(column_name,3,3),substring(column_name,7,length(column_name)-7)

答案 3 :(得分:0)

在表格中创建一个附加列,其中包含所需字典顺序中的值。在表中输入新值时,编写代码(或其他表驱动的进程)以设置此列的值。添加性能索引。允许用户覆盖系统建议值。

在ORDER BY子句中使用此表将行排列为所需的序列。

否则,您将构建一个任意复杂的规则集,永远不会满足所有异常,维护最终会使您陷入复杂的困境。

您可以使用正则表达式或类似的东西从原始名称中提取建议的排序字符串。

答案 4 :(得分:0)

你有一个格式的字符串:“:”。

您可以通过明智地使用substring_index()来进行排序。想法是将数字转换为数字,首先提取值,然后将其转换为数字。这让你非常接近你想要的东西:

order by substring_index(substring_index(causule, ':', 1), -1) + 0

问题是连字符后面的部分。具有相同值“”的行都是等价的。要区分它们,请在空格后拉出字符串的一部分:

order by substring_index(substring_index(causule, ':', 1), -1) + 0,
         substring_index(substring_index(causule, ':', 1), -1)