2016-09-07 26 views
0

你会怎么写sql通过所谓的“sequentialOrder” 与像7.5.5 以便记录在SQL - 如何与价值排序字段,如1.4.2

顺序出来值的文本字段订购
1.2.4 
    2.3.8 
    11.3.4 

,而不是像这样

11.3.4   
    1.2.4 
    2.3.8 
+0

使用数字敏感整理。 – jarlh

+0

是固定的字符串格式吗?它是否总是有3个数字以'.'s分隔? –

+0

你总是会有2位小数? –

回答

0

你必须将给定版本字符串来访问它的组件实现其ORDER BY语义。有很多方法可以做到这一点。我个人尽量避免CLR代码,所以这才是我的建议:解析使用点作为分隔符的版本中,每个值转换为数字,聚集它放回列,并使用正确的ORDER BY条款:

-- this script uses the function [dbo].[DelimitedSplit8K] to split a delimited 
-- string value into multiple rows; it was published and is avalable at 
-- http://www.sqlservercentral.com/articles/Tally+Table/72993/ 

-- setup 
CREATE TABLE version (id VARCHAR(20)) 
INSERT version (id) VALUES('1.2.4'); 
INSERT version (id) VALUES('2.3.8'); 
INSERT version (id) VALUES('11.3.4'); 

-- cte query 
; WITH inrows AS (
    -- split version ID into many rows 
    SELECT ver.id, dlm.itemNumber, CONVERT(INT, dlm.item) as item 
    FROM version ver 
    CROSS APPLY [dbo].[DelimitedSplit8K](ver.id, '.') dlm 
) 
, inCols AS (
    -- aggregate the rows groupped by id 
    SELECT inr.id 
    , MAX(CASE WHEN inr.itemNumber = 1 THEN inr.item ELSE NULL END) AS [major] 
    , MAX(CASE WHEN inr.itemNumber = 2 THEN inr.item ELSE NULL END) AS [minor] 
    , MAX(CASE WHEN inr.itemNumber = 3 THEN inr.item ELSE NULL END) AS [revision] 
    FROM inrows inr 
    GROUP BY inr.id 
) 
SELECT * 
FROM inCols inc 
ORDER BY inc.major, inc.minor, inc.revision; 

-- RESULTS ================================================ 
-- id     major  minor  revision 
-- -------------------- ----------- ----------- ----------- 
-- 1.2.4    1   2   4 
-- 2.3.8    2   3   8 
-- 11.3.4    11   3   4