问题描述
我从互联网上获得了一个用户定义函数的引用,该函数可以定位第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
它在结果下方显示我,无法正确排序。
实际上我希望输出示例如下:
这是在对列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