Sql 按十进制选择语句顺序
我运行了这个查询Sql 按十进制选择语句顺序,sql,sql-server,Sql,Sql Server,我运行了这个查询 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-
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
进入
我想知道如何按A-Z顺序以及按十进制顺序。我以为我运行的查询会起作用,但事实并非如此
非常感谢您的帮助。试试这个
select partnumber,
substring(partnumber,1, charindex('-',partnumber)-1),
convert(decimal(20,4),substring(partnumber,charindex('-',partnumber)+1,100))
from products
order by 2,3
第三行的100真是一种懒惰的方式。。。你可以做lenstr-charindexstr。。。如果您愿意的话。任何优秀的程序员都会创建一个简单的测试数据库 这是我在[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和空字符串以进行否定测试
如果我保证字符串总是>=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
微软编写的ISNUMERIC函数有一个鲜为人知的bug。它告诉你一个。是一个有效的数字
这种情况可能会破坏代码。要么测试这种情况,要么下载我创建的几个内联表函数来处理它
请看文章是我的字符串一个数字
你的意思是什么?你想如何对结果排序?查询不会在小数点后排序,所以我得到ABC60.0,然后我得到ABC7.0。你已经再次感谢了!将数据类型nvarchar转换为float时出错:而且,当我将as float更改为as nvarchar时,它仍然无法正确排序零件号。。SMFLP2F-7.0 SMFLP2F-9.9 SMFLP3.0 SMFLP3.5 SMFLP3.8 SMFLP36.0 SMFLP4.0 SMFLP4。25@user3241586当然不是!如果您强制转换为nvarchar,它将按字母字符排序,这与您不希望的输出相同!您使用的是什么版本的SQL server?从底部的MSDN转换图来看,应该没有问题。数据中有双小数吗。如果是这样,那是另一个问题!更改代码以将句点替换为空字符串。顺便说一句-2014年CTP 2CastrepPlaceSubstringpSort,4,lenpsort-4'.'作为浮点,对nvarchar演员阵容没有任何问题-唯一能打破这一局面的是,如果你最大化了浮点数的范围。您可以始终使用bigint,但这取决于您的数据。
-- 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