选择“按十进制的语句顺序”

时间:2014-02-05 16:21:48

标签: 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-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订购以及按小数订购。我认为我运行的查询可以解决问题,但事实并非如此。

我非常感谢你的帮助,谢谢你。

2 个答案:

答案 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

enter image description here

您会注意到我确实向表中添加了错误数据,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

enter image description here

Microsoft编写的ISNUMERIC函数有一个鲜为人知的bug。它告诉你一个。是一个有效的数字。

这种情况可能会破坏代码。要么测试那个案例,要么下载我创建的几个内联表函数来处理它。

请参阅文章“我的字符串是否为数字!”

http://craftydba.com/?p=6987

答案 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)...如果你愿意的话。