繁体   English   中英

SQL ORDER BY难题与数字

[英]SQL ORDER BY dilemma with numbers

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

我正在尝试按字母顺序对其进行排序,但除了一件小事之外,它都可以正常工作。

当我尝试保存数字和字母的混合形式时,它将返回“文字”字母顺序,这意味着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

它跨越一个大型数据库,我不能只将数字值与文本值分开。

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

关于我的问题有什么建议吗? 谢谢。

这是我在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

我将按照以下方式进行处理...

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

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,但是希望这可以给您足够的开始解决它的方法

您应该通过执行以下操作来摆脱困境:

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

尝试以下命令:

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

如果您发现这种情况不起作用,请将其与您想要的排序顺序一起发布,我可以看看是否有解决方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM