Tri du text hiérarchique en SQL

J'ai une table avec un champ varchar . Ce champ stocke les numéros hiérarchiques que je veux order.

Voici un exemple de mes données:

 1 1.1 1.1.1 1.1.2 1.1.3. 1.1.4 1.1.5 1.1.6. 1.1.7 10. 10.1 10.2 10.3 11. 11.1 11.2 2. 2.1 1.2.2 1.2.2.1 1.2.2.2 

Comment puis-je get le résultat suivant avec T-SQL :

 1 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.2.2 1.2.2.1 1.2.2.2 2. 2.1 10. 10.1 10.2 10.3 11. 11.1 11.2 

J'ai essayé de séparer les parties avec le SQL suivant, mais ce n'est pas élégant.

 SELECT CASE WHEN CHARINDEX('.',SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.','')) = 0 THEN SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.','') ELSE REPLACE(SUBSTRING(SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.',''),1, CHARINDEX('.',SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.',''))),'.','') END AS FIRST_PART ,CASE WHEN CHARINDEX('.',SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.','')) > 0 THEN SUBSTRING( SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.','') ,CHARINDEX('.',SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.','')) +1 ,LEN( SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.','') ) ) ELSE '0' END AS SECOND_PART FROM TEST_TABLE 

Y a-t-il une meilleure façon de faire cela?

    Essaye ça:

     DECLARE @DataSource TABLE ( [Value] VARCHAR(12) ); INSERT INTO @DataSource ([Value]) VALUES ('1') ,('1.1') ,('1.1.1') ,('1.1.2') ,('1.1.3.') ,('1.1.4') ,('1.1.5') ,('1.1.6.') ,('1.1.7') ,('10.') ,('10.1') ,('10.2') ,('10.3') ,('11.') ,('11.1') ,('11.2') ,('2.') ,('2.1') ,('1.2.2') ,('1.2.2.1') ,('1.2.2.2'); SELECT * FROM @DataSource ORDER BY CAST('/' + IIF(RIGHT([Value],1) = '.', LEFT([Value], LEN([Value]) - 1), [Value]) + '/' AS HIERARCHYID); 

    Vous pouvez vérifier le hierarchyid pour plus de détails. La vérification dans la clause ORDER BY est juste en supprimant le . à la fin de la valeur (s'il existe).


    Vous pouvez changer la fonction IIF avec CASE WHEN simple comme ceci:

     SELECT * FROM @DataSource ORDER BY CAST('/' + CASE WHEN RIGHT([Value],1) = '.' THEN LEFT([Value], LEN([Value]) - 1) ELSE [Value] END + '/' AS HIERARCHYID); 

    Enlever les points et order:

     select column from table order by replace(column,'.','') 

    Et il n'est pas nécessaire de convertir varchar en nombre si vous voulez que 10 vienne avant 2.