SQL ORDER BY与数字的困境

时间:2011-09-29 06:10:25

标签: mysql sql sql-order-by

我有一个包含varchar数据类型的表。最多可容纳128个字符

我正在尝试按字母顺序排序,除了一件小事之外,它的效果很好。

当我尝试保存数字和字母的混合时,它会返回'literal'字母顺序,这意味着11在2之前首先出现。

我已经阅读了互联网上几乎所有的答案,但它们都是不能专门解决我的问题的解决方法。

我想按顺序放置的值的示例

Apartment
House
Dog
Cat
18 years old
2 years old
1 year old

但我希望它看起来像这样。

1 year old
2 years old
18 years old
Apartment
Cat
Dog
House

它跨越一个大型数据库,我不能将数值除了文本数据之外。

也可以使用该程序的用户可以使用字母数字字符对其进行修改。

有关我的问题的任何建议?感谢。

4 个答案:

答案 0 :(得分:3)

这是我在SQL Server中尝试过的。它既不优雅也不适合制作,但它可能会给你一个想法。

SELECT StringValue, 
    CAST(SUBSTRING(StringValue, StartPos, EndPos - StartPos) AS INT) AsNumber,
    SUBSTRING(StringValue, StartPos, EndPos - StartPos) NumberToken,
    SUBSTRING(StringValue, EndPos, 1000) Rest,
    StartPos, 
    EndPos
FROM    
    (SELECT 
        StringValue,
        PATINDEX('[0-9]%', StringValue) StartPos,
        PATINDEX('%[^0-9]%', StringValue) EndPos
    FROM 
        (SELECT 'abc123xyz' StringValue
        UNION SELECT '1abc'
        UNION SELECT '11abc'
        UNION SELECT '2abc'
        UNION SELECT '100 zasdfasd') Sub1
    ) Sub2
ORDER BY AsNumber, Rest

结果:

StringValue       AsNumber        NumberToken  Rest            StartPos     EndPos
abc123xyz                 0                    abc123xyz               0          1
1abc                      1                  1 abc                     1          2
2abc                      2                  2 abc                     1          2
11abc                    11                 11 abc                     1          3
100 zasdfasd            100                100  zasdfasd               1          4

答案 1 :(得分:1)

我会按如下方式处理......

首先,编写一个表达式将数字内容转换为整数,如

select CAST(SUBSTRING(<field>',1,instr(<field>',' ') as INT),<field>

然后我会使用UNION ALL语句,类似这样的

SELECT CAST(SUBSTRING(<field>',1,instr(<field>',' ') as INT),<field>,A.*
FROM <table> A
WHERE <field> LIKE <regular expression to get fields beginning with numbers>
UNION ALL
SELECT 999999,<field>,A.*
FROM <table> A
WHERE <field> NOT LIKE <regular expression to get fields beginning with numbers>
ORDER BY 1,2,3

数字将首先按数字顺序显示。正弦所有的alpha数据都有相同的数字键,它会在数字后按字母顺序排序......请确保使alpha虚拟键(999999)足够大,以便在所有数字键之后...

我在这台机器上没有mySQL,但希望这给你足够的开始解决它

答案 2 :(得分:0)

你应该通过做这样的事情来逃避:

order by right(replicate(' ',30)+Column_name,30)

答案 3 :(得分:0)

请按以下方式试用此订单:

ORDER BY RIGHT(REPLICATE('0',128)+value,128)

我的测试:

DECLARE @T TABLE
(
value VARCHAR(128)
)

INSERT INTO @T VALUES('Apartment'),
('House'),
('Dog'),
('Cat'),
('18 years old'),
('2 years old'),
('1 year old'),
('12 horses'),
('1 horse')


SELECT * FROM @T
ORDER BY RIGHT(REPLICATE('0',128)+value,128)

结果:

Cat
Dog
House
1 horse
12 horses
Apartment
1 year old
2 years old
18 years old

如果您发现这不起作用的情况,请将其与您希望的排序顺序一起发布,我可以看到是否有修复。