2016-09-07 1 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