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
你会怎么写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
你必须将给定版本字符串来访问它的组件实现其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
使用数字敏感整理。 – jarlh
是固定的字符串格式吗?它是否总是有3个数字以'.'s分隔? –
你总是会有2位小数? –