用户定义的函数排序列问题

问题描述

我从互联网上获得了一个用户定义函数的引用,该函数可以定位第n个出现的字符串以在数据库中进行排序列的名称。我正在使用MysqL 5.5版本,而不是最新版本。这是我的示例数据库链接https://dbfiddle.uk/?rdbms=mysql_5.5&fiddle=bcb32a6b47d0d5b061fd401d0888bdc3

我的问题是我想按照前缀数字对数据库中的列name进行排序,但是我在SQL查询下面使用它,但这没用。

select t.id,t.name
from
(
select t.*,cast((case when col1_col2_ref > 0 
                      then 
                        substring_index(modified_name,'-',1)
                  else 
                     modified_name
                  end
                  ) as unsigned) col1,cast((case when    col1_col2_ref > 0
                           and col3_ref > 0
                       then 
                          substr(modified_name,(col1_col2_ref + 1),(col3_ref - (col1_col2_ref + 1)))
                       when col1_col2_ref > 0
                       then 
                         substr(modified_name,(col1_col2_ref + 1))
                  end) as unsigned) col2,cast((case when    col3_ref > 0
                           and col4_ref > 0
                       then 
                         substr(modified_name,(col3_ref + 1),(col4_ref - (col3_ref + 1)))
                       when col3_ref > 0
                       then 
                         substr(modified_name,(col3_ref + 1))
                  end) as unsigned) col3,cast((case when col4_ref > 0
                        then 
                         substr(modified_name,(col4_ref + 1))
                   end) as unsigned) col4
from
(
select t.*,substring_index(name,' ',1) modified_name,locate('-',name,1) col1_col2_ref,locate('/',1) col3_ref,1)+1) col4_ref
  from filing_code_management t
) t
) t
order by col1,col2,col3,col4

它在结果下方显示我,无法正确排序。

Output 1

实际上我希望输出示例如下:

Output 2

Output 3

这是在对列name链接https://dbfiddle.uk/?rdbms=mysql_5.5&fiddle=6b12a4d42359cb30f27a5bfb9d0c8210进行排序之前。将我插入新数据后,它对我不起作用。如果将(R)100-6-2-2 Mesyuarat Majlis Kerajaan Negeri (MMKN) JKK放在前面,则可能是新数据中的一个示例,例如错误()。或者,如果我将/放在单词之间,则出现类似错误100-1-1 Penggubalan/Penyediaan/Pindaan Undang-Undang/Peraturan的新数据。

希望有人可以指导我解决此问题。谢谢。

解决方法

您应该能够使以下代码适合您的需求(在DB Fiddle中经过测试!)。我使用了file_name列而不是name列来稍微简化构建排序字段,因为似乎文件名总是在name字段的第一部分重复出现。

使用正则表达式支持,这会简单得多,但是我注意到您使用的MySQL版本没有此功能(如果我没记错的话,我认为它会出现在SQL 8.0中)。 / p>

SELECT id,num_hyphens,CAST(SUBSTRING_INDEX(CONCAT(file_name_adj,'-'),'-',1) AS UNSIGNED) AS sort1,CAST(CASE WHEN num_hyphens = 0 
          THEN '0' 
          ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(file_name_adj,2),-1) 
          END AS UNSIGNED) AS sort2,CAST(CASE WHEN num_hyphens <= 1 
          THEN '0' 
          ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(file_name_adj,3),-1) 
          END AS UNSIGNED) AS sort3,CAST(CASE WHEN num_hyphens <= 2 
          THEN '0' 
          ELSE SUBSTRING_INDEX(file_name_adj,-1) 
          END AS UNSIGNED) AS sort4,file_name,name
FROM (
SELECT id,name,MID(file_name,instr(file_name,')') + 1) AS file_name_adj,LENGTH(file_name) - LENGTH(REPLACE(file_name,'')) AS num_hyphens 
FROM filing_code_management
) t1
ORDER BY sort1,sort2,sort3,sort4