Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按十进制选择语句顺序_Sql_Sql Server - Fatal编程技术网

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