使用按案例排序的SQLServer2005

使用按案例排序的SQLServer2005,sql,sql-server,Sql,Sql Server,我有以下专栏: ╔════════════════════════════╗ ║ 'Symbol' ║ ╠════════════════════════════╣ ║ RELIANCE14JULFUT ║ ║ RELIANCE14JUL900CE ║ ║ RELIANCE14JUL1040CE ║ ║ RELIANCE14JUL980CE ║ ║ RELIANCE14JUL1020PE

我有以下专栏:

╔════════════════════════════╗
║         'Symbol'           ║
╠════════════════════════════╣
║ RELIANCE14JULFUT           ║
║ RELIANCE14JUL900CE         ║
║ RELIANCE14JUL1040CE        ║
║ RELIANCE14JUL980CE         ║
║ RELIANCE14JUL1020PE        ║
║ RELIANCE14JUL1040PE        ║
║ RELIANCE14JUL980PE         ║
║ RELIANCE14JUL1140PE        ║
║ NIFTY14JULFUT              ║
╚════════════════════════════╝
我的代码是:

DECLARE @Symbol NVARCHAR (50) 
DECLARE @SpFrom NVARCHAR (50) 
DECLARE @SpTo NVARCHAR (50) 

SET @Symbol = 'RELIANCE14JUL' 
SET @SpFrom = 980 
SET @SpTo = 1100 

SELECT Replace(symbol, @Symbol, '')AS St 
FROM   symbol 
WHERE  ( symbol LIKE @Symbol + '%' 
         AND Replace(symbol, @Symbol, '') = 'FUT' ) 
    OR ( symbol LIKE @Symbol + '%' 
         AND Cast(LEFT(Replace(symbol, @Symbol, ''), 
                  Len(Replace(symbol, @Symbol, '')) - 2) 
                      AS INT) BETWEEN @SpFrom AND @SpTo ) 
GROUP  BY symbol 
ORDER  BY CASE 
            WHEN symbol LIKE '%FUT' THEN 1 
            WHEN symbol LIKE '%CE' THEN 2 
            WHEN symbol LIKE '%PE' THEN 3 
            ELSE 4 
          END, 
          symbol 
我越来越

╔═══════════╗
║   ST      ║
╠═══════════╣
║ FUT       ║
║ 1020CE    ║
║ 1040CE    ║
║ 980CE     ║
║ 1020PE    ║
║ 1040PE    ║
║ 980PE     ║
╚═══════════╝
这东西订得不好,我需要

╔═════════════╗
║    ST       ║
╠═════════════╣
║ FUT         ║
║ 980CE       ║
║ 1020CE      ║
║ 1040CE      ║
║ 980PE       ║
║ 1020PE      ║
║ 1040PE      ║
╚═════════════╝

这是

上的示例在对该示例进行了一段时间的研究后,我创建了以下解决方案:

DECLARE @Date DATETIME 
DECLARE @Symbol NVARCHAR (50) 
DECLARE @SpFrom NVARCHAR (50) 
DECLARE @SpTo NVARCHAR (50) 

SET @Date = '07/23/2014' 
SET @Symbol = 'RELIANCE14JUL' 
SET @SpFrom = 980 -------- use 1000 
SET @SpTo = 1100 

SELECT Replace(symbol, @Symbol, '')AS St 
FROM   opt 
WHERE  ( symbol LIKE @Symbol + '%' 
         AND Replace(symbol, @Symbol, '') = 'FUT' ) 
    OR ( symbol LIKE @Symbol + '%' 
         AND Cast(LEFT(Replace(symbol, @Symbol, ''), 
                  Len(Replace(symbol, @Symbol, '')) - 2) 
                      AS INT) BETWEEN @SpFrom AND @SpTo ) 
GROUP  BY symbol 
ORDER  BY CASE 
            WHEN symbol LIKE '%FUT' THEN 1 
            WHEN symbol LIKE '%CE' THEN 2 
            WHEN symbol LIKE '%PE' THEN 3 
            ELSE 4 
          END, 
          Cast(CASE 
                 WHEN symbol LIKE '%FUT' THEN 0 
                 ELSE LEFT(RIGHT(symbol, Len(symbol) - 13), 
                      Len(RIGHT(symbol, Len(symbol) - 13)) - 2) 
               END AS INT) 

请看一个例子

为了正确的想法,我附加了sql Fiddle的可能重复项,并且没有重复项您想要排序的方式被称为“自然排序”。@gopi:再次重复我对您前面一个问题的评论:嗯,像这样将多条信息存储到一列中总是一团糟,这违反了数据库设计的第一种正常形式。如果您有多条信息(NIFTY,14,JUL,FUT)-您应该将它们存储在单独的列中-那么查询也将非常容易!主席先生,我同意你的意见,我会继续执行