MS-SQL中,tb表数据如下:
id   productname
1    10mm圆板
2    27mm柜身板
3    TB10mm圆板
4    18mm柜身板
5    10mm柜身板
6    TB18mm柜身板
7    TB10mm柜身板
8    TB27mm内侧板
9    10mm底板如何写一条SQL查询语句,让这些数据按板的厚度按如下方式排序呢?意思说,将厚度一样的排在一起,并按小到大排。
难点是,有些板的厚度前加了TB这种情况。
9    10mm底板
5    10mm柜身板
1    10mm圆板
7    TB10mm柜身板
3    TB10mm圆板
4    18mm柜身板
6    TB18mm柜身板
2    27mm柜身板
8    TB27mm内侧板

解决方案 »

  1.   

    order by replace(productname,'tb',''),productname
      

  2.   

    select * from tb
    order by
      substring(productname,patindex('%[0-9]%',productname)-patindex('%[吖-做]%',productname)-1)
      

  3.   

    select * from tb
    order by
      cast(substring(productname,patindex('%[0-9]%',productname)-patindex('%[吖-做]%',productname)-3) as int)
      

  4.   

    select * from tb
    order by
      cast(substring(productname,
                     patindex('%[0-9]%',productname),
                     patindex('%[吖-做]%',productname)-patindex('%[0-9]%',productname)-2
                    ) 
           as int
           )
    再改改
      

  5.   

    难点是,有些板的厚度前加了TB这种情况。 --这个是最好处理的.去掉TB就可以了,如一楼.
      

  6.   

    order by replace(productname,'tb',''),productname,id desc
      

  7.   

    用2楼的改进一下, 呵呵
    select * from tb
    order by right(productname,len(productname) - patindex('%[0-9]%',productname)+1), productname;
      

  8.   

    按1楼的,排序如下:
    9    10mm底板 
    5    10mm柜身板 
    7    TB10mm柜身板
    1    10mm圆板 
    3    TB10mm圆板 
    4    18mm柜身板 
    6    TB18mm柜身板 
    2    27mm柜身板 
    8    TB27mm内侧板 
    这要样的话,10mm的板不排在一起了。我想将TB的板也排在一起。
      

  9.   

    ------------------------------------
    -- Author: flystone  
    -- Version:V1.001  
    -- Date:2009-09-16 22:31:15
    -------------------------------------- Test Data: ta
    If object_id('ta') is not null 
        Drop table ta
    Go
    Create table ta(id int,productname nvarchar(9))
    Go
    Insert into ta
    select 1,'10mm圆板' union all
    select 2,'27mm柜身板' union all
    select 3,'TB10mm圆板' union all
    select 4,'18mm柜身板' union all
    select 5,'10mm柜身板' union all
    select 6,'TB18mm柜身板' union all
    select 7,'TB10mm柜身板' union all
    select 8,'TB27mm内侧板' union all
    select 9,'10mm底板' 
    Go
    --Start
    Select * ,patindex('%[^a-zA-Z0-9]%',productname)
    from ta
    order by replace(left(productname,patindex('%[^a-zA-Z0-9]%',productname)-1),'TB',''),case when left(productname,2) = 'TB' then 1 else 0 end,id desc--Result:
    /*
    id          productname             
    ----------- ----------- ----------- 
    9           10mm底板      5
    5           10mm柜身板     5
    1           10mm圆板      5
    7           TB10mm柜身板   7
    3           TB10mm圆板    7
    4           18mm柜身板     5
    6           TB18mm柜身板   7
    2           27mm柜身板     5
    8           TB27mm内侧板   7(所影响的行数为 9 行)*/
    --End 
      

  10.   


    If object_id('ta') is not null 
        Drop table ta
    Go
    Create table ta(id int,productname nvarchar(9))
    Go
    Insert into ta
    select 1,'10mm圆板' union all
    select 2,'27mm柜身板' union all
    select 3,'TB10mm圆板' union all
    select 4,'18mm柜身板' union all
    select 5,'10mm柜身板' union all
    select 6,'TB18mm柜身板' union all
    select 7,'TB10mm柜身板' union all
    select 8,'TB27mm内侧板' union all
    select 9,'10mm底板' 
    Goselect *,
    (rank() over (partition by substring(productname,patindex('%[0-9]%',productname),2) order by productname))as rank
    from ta
    --假设厚度都是两位数字
      

  11.   

    学习了,熟悉patindex函数就好处理了
    不过表的设计不太好,加一个规格的字段就不会出现楼主的困惑了