使用按案例排序的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)-您应该将它们存储在单独的列中-那么查询也将非常容易!主席先生,我同意你的意见,我会继续执行