如何对具有特殊字符的整数值的varchar列进行排序

时间:2017-01-13 05:56:12

标签: mysql sql

如何对包含具有特殊字符的整数值的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

3 个答案:

答案 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的积分!

SQL Fiddle

答案 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') 
)

SQLFiddle demo

答案 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