我有一个包含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
它跨越一个大型数据库,我不能将数值除了文本数据之外。
也可以使用该程序的用户可以使用字母数字字符对其进行修改。
有关我的问题的任何建议?感谢。
答案 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
如果您发现这不起作用的情况,请将其与您希望的排序顺序一起发布,我可以看到是否有修复。