我运行了这个查询......
SELECT *, STUFF(PartNumber,1,3,'')
FROM [devbivarcom].[Products].[Products]
ORDER BY (case when isnumeric(STUFF(PartNumber,1,3,'')) = 1
then CAST(STUFF(PartNumber,1,3,'')AS FLOAT)
end);
改变
LA-1.3
LC-4.12
LC-4.25
LC-4.5
LC-4.975
LC-40.0
LC-48.0
LC-5.0
LC-5.5
LC-5.75
进入
LA-1.3
LC-4.12
LC-4.25
LC-4.5
LC-4.975
LC-5.0
LC-5.5
LC-5.75
LC-40.0
LC-48.0
我想知道如何通过A-Z订购以及按小数订购。我认为我运行的查询可以解决问题,但事实并非如此。
我非常感谢你的帮助,谢谢你。
答案 0 :(得分:1)
任何优秀的程序员都会创建一个简单的测试数据库。
我的[tempdb]中有我的数据,表格[products]
-- Just playing
use tempdb;
go
-- Create table
create table products
(
pid int identity(1,1) primary key,
psort varchar(16)
);
go
-- Add data
insert into products (psort)
values
('LA-1.3'),
('LC-4.12'),
('LC-4.25'),
('LC-4.5'),
('LC-4.975'),
('LC-40.0'),
('LC-48.0'),
('LC-5.0'),
('LC-5.5'),
('LC-5.75');
go
insert into products (psort) values (NULL);
insert into products (psort) values ('');
-- Show the data
select * from products;
go
您会注意到我确实向表中添加了错误数据,NULL和EMPTY字符串进行了否定测试。
如果我保证字符串始终是> = 4个字符,并且字符串的最后一部分是一个数字,那将是一个快照。
由于生活并不完美,我们需要为这些案件编码。
-- Order data
select
*
from
products
order by
case
when len(psort) < 3 then ''
else substring(psort,1,3)
end,
case
when len(psort) < 4 then ''
when isnumeric(substring(psort,4,len(psort) - 4)) = 1 then
cast(substring(psort,4,len(psort) - 4) as float)
else ''
end
go
Microsoft编写的ISNUMERIC函数有一个鲜为人知的bug。它告诉你一个。是一个有效的数字。
这种情况可能会破坏代码。要么测试那个案例,要么下载我创建的几个内联表函数来处理它。
请参阅文章“我的字符串是否为数字!”
答案 1 :(得分:0)
试试这个。
select partnumber,
substring(partnumber,1, charindex('-',partnumber)-1),
convert(decimal(20,4),substring(partnumber,charindex('-',partnumber)+1,100))
from products
order by 2,3
第3行中的 100 实际上是一种懒惰的方式......你可以做len(str) - charindex(str)...如果你愿意的话。