自定义函数排序列问题

User-defined function sorting column problem

我从 Internet 上参考了一个用户定义的函数来定位第 n 次出现的字符串以对数据库中的列名称进行排序。我使用的是 MySQL 5.5 版本,不是最新版本。这是我的示例数据库 link 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('/',name,1) col3_ref
          ,locate('/',name,locate('/',name,1)+1) col4_ref
  from filing_code_management t
) t
) t
order by col1,col2,col3,col4

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

Output 1

实际上我想要如下的输出样本:

Output 2

Output 3

这是在我对 name link、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 的新数据中,如果我把 / 放在单词之间。

希望有人能指导我解决这个问题。谢谢。

您应该能够根据您的需要调整以下代码(已在您的数据库中测试 Fiddle!)。我使用 file_name 列而不是名称列来稍微简化排序字段的构建,因为文件名似乎总是在名称字段的第一部分重复。

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

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, file_name, 
        LENGTH(file_name) - LENGTH(REPLACE(file_name, '-', '')) AS num_hyphens 
FROM filing_code_management
) t1
ORDER BY sort1, sort2, sort3, sort4