如何对包含具有特殊字符的整数值的varchar列的表进行排序 我在数据库中有一个表,其中包含varchar类型的列,值类似于 在这里我尝试使用下面的mysql查询
SELECT * FROM table order by CONVERT(seq_no,signed integer) ASC
我在这里得到这样的结果。
1
2
3
4
5
6
6_1
6_2
6_1_1
6_1_2
7
8
8_1
8_2
8_1_1
8_1_2
8_2_1
8_2_2
但结果应如下所示。
1
2
3
4
5
6
6_1
6_1_1
6_1_2
6_2
7
8
8_1
8_1_1
8_1_2
8_2
8_2_1
8_2_2
我也尝试过这个查询,但没有得到确切的结果。
SELECT * FROM table order by CONVERT(seq_no,signed integer) ASC,seq_no
答案 0 :(得分:1)
您可以尝试这样的事情:
select *
from table
where id = 18
order by cast(replace(INSERT(colname, LOCATE('_', colname), CHAR_LENGTH('_'), '.'),'_','') as decimal(10,4))
这是如何运作的:
e.g。 '6_1_1'首先变为'6.1_1'然后变为'6.11'。在转换为数字后,这将超过6.1,即转换前的'6_1',小于6.12('6_1_2),也小于10。
注意:替换第一次出现位this answer的积分!
答案 1 :(得分:0)
我认为您应该将这些线转换为具有固定长度部分的线。 例如,让我们将其转换为10个字母长度的部分:
6_1_2 -> 000000000600000000010000000002
6123_1111_33333 -> 000000612300000011110000033333
1123_5555 -> 000000112300000055550000000000
在这种情况下,您可以通过此字符串进行排序。您可以使用SUBSTRING_INDEX()和LPAD()功能:
SELECT *
FROM Table1
ORDER BY
CONCAT
(
LPAD(SUBSTRING_INDEX( concat(seq_no,'_') , '_', 1 ),10,'0')
,
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX( concat(seq_no,'_') , '_', 2 ),'_',-1),10,'0')
,
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX( concat(seq_no,'_') , '_', 3 ),'_',-1),10,'0')
,
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX( concat(seq_no,'_') , '_', 4 ),'_',-1),10,'0')
)
答案 2 :(得分:-1)
尝试此查询: -
;WITH CTE AS
(
SELECT BatchNumber, CAST(CONCAT('<A>',REPLACE(BatchNumber,'_','</A><A>'),'</A>') AS XML) Xmlcol
, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) rnk
FROM ApplicationBatchNumbers
)
,CTE1 AS
(
SELECT BatchNumber, SplittedString , rnk , ROW_NUMBER() OVER (PARTITION BY RNK ORDER BY (SELECT NULL)) finalrnk
FROM
(SELECT * FROM CTE) s
CROSS APPLY
(
SELECT ProjectData.D.value('.', 'smallint') as SplittedString
FROM s.xmlcol.nodes('A') as ProjectData(D)
) a
)
SELECT BatchNumber FROM CTE1
PIVOT ( MAX(SplittedString) FOR finalrnk IN ([1],[2],[3]) ) pvt