2012-07-27 37 views
1

嗨排序我目前在做数据库所需要的批号字母在SQL

prefix is nvarchar 
lotnum is int 
suffix is nvarchar 

我已成功转换的批号 码,我用排序项目

Select (case when prefix is null then '' else prefix end) + 
CONVERT (nvarchar , (lotnumber)) +(case when suffix is null then '' else suffix end) 
(values in the database are a1a,1a,1,2,100) 

当我我order by lotnumber得到

a1a 
1a 
1 
2 
100 

然后通过前缀顺序并得到这样的结果

1 
a1a 
1a 
2 
100 

我已经添加了后缀以及与返回相同的结果

我需要如下

1 
1a 
2 
100 
a1a 

请能有人帮我在这

来订购吧
+0

表中是否有前缀,批号和后缀3列或单个列的某些部分? – 2012-07-27 10:05:52

+0

我认为在你的情况下,排序应该按字母顺序排列。 – 2012-07-27 10:06:19

+1

**什么**数据库系统,以及哪个版本? * SQL *只是*结构化查询语言* - 许多数据库系统使用的语言,但不是数据库产品......这样的功能通常是特定于供应商的 - 因此我们确实需要知道**数据库系统**您正在使用.... – 2012-07-27 10:14:32

回答

3

您是否尝试过使用三列进行排序?

ORDER BY prefix, lotnum, suffix 

顺便说一句,我可以看到你正在使用SQL Server。为了使事情更具可移植性,我建议使用COALESCE和CAST而不是CASE/WHEN和CONVERT作为前缀和lotnum。完整查询可能如下所示。

SELECT 
    COALESCE(prefix, '') 
    + CAST(lotnum AS NVARCHAR) 
    + COALESCE(suffix, '') AS lot_number 
FROM 
    YourTable 
ORDER BY 
    COALESCE(prefix, '') 
    ,lotnum 
    ,COALESCE(suffix, '') 
+0

我认为第一个建议是最好的。我并不认为他真的想将lotnum转换为字符串,所以2会在100之前排序。不要担心零填充或任何其他问题,只需保留数据类型并按前缀,lotnum,后缀排序即可。 – GilM 2012-07-27 16:25:07

+0

@GilM你说得对,我错误地将CAST留在了ORDER BY子句中。现在修复它。 – Diego 2012-07-27 18:48:42

+0

我想,@Diego。顺便说一下,我认为在ORDER BY中省略COALESCE函数也可以很好地工作。我相信空值会排在最前面。 – GilM 2012-07-27 22:52:04