Сортировать по столбцу Nvarchar, содержащему десятичное значение - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть следующая таблица и данные в базе данных сервера SQL. Я пытаюсь получить порядок данных по столбцу [Version]. Я хочу, чтобы результат был организован следующим образом:

enter image description here

Как мне этого добиться?

CREATE TABLE [dbo].[DocumentLog](
[DocID] [nvarchar](50) NOT NULL,
[Version] [nvarchar](50) NOT NULL) ON [PRIMARY]
GO

INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.1');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.5');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.3');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.4');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.2');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.6');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.7');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.9');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.8');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.10');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.11');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.12');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.13');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.14');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.15');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.16');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.17');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','0.18');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','1.0');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','1.1');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','1.10');
INSERT INTO DocumentLog (DocID,[version])values('doc0001','2.0');

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Настоящая проблема здесь - структура вашей таблицы. У вас должно быть два столбца (или четыре в моделях управления версиями программного обеспечения) для хранения информации о версии. Так как у вас нет этого, вы должны иметь дело с этим совершенно запутанным способом. Поскольку ваши данные выглядят непротиворечивыми, вы можете использовать для этого PARSENAME .

select * 
from DocumentLog
order by convert(int, PARSENAME(Version, 2))
    , convert(int, PARSENAME(Version, 1))
0 голосов
/ 26 апреля 2018

Я думаю, вы ищете что-то вроде этого:

SELECT
    *,
    TRY_CAST(LEFT([version], CHARINDEX('.', [version])-1) AS int) MainVer,
    TRY_CAST(RIGHT([version], LEN([version]) - CHARINDEX('.', [version])) AS int) AS SubVer
FROM DocumentLog
ORDER BY MainVer, SubVer;

Для SQL Server до 2012 года заменить TRY_CAST на CAST.

...