ORDENAR STRING CAPITULADA

LUIS.HERRERA 14/10/2016 08:07:43
#468080
Bom dia.
Tenho uma tabela com 4 colunas:
ID, IDNorma, CODIGO, Descricao

A coluna CODIGO (tipo NVarchar) guardar os códigos de capitulação de uma norma ex:

4
4.1
4.1.1
5
....
10
10.1
10.1.1
10.1.1.1
etc...

O problema é que na hora se fazer um SELECT e ordenar por essa coluna os números saem assim

10
10.1
10.1.1
10.1.1.1
4
4
4.1
4.1.1
5

Como posso ordenar corretamente assim ?

4
4.1
4.1.1
5
10
10.1
10.1.1
10.1.1.1

NOTA: Não foi possível converter esta coluna em número, pois como há mais de um PONTO na string, o SQL não aceita a conversão.
LVFIOROT 14/10/2016 13:00:16
#468084
bom, terá que criar um function para formatar esses testes com 00000 na frente de cada numero....
por desta forma nao vejo como ordernar. exemplo

10.1.1.1 -> 00010.00001.00001.00001

usando um function scalar como retorno e ordenando pela resposta.
LVFIOROT 14/10/2016 13:21:45
#468085
EXEMPLO USANDO O CAMPO HIERARQUIA

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION fcs_HierarchyidValue
(@value AS nvarchar(4000))
RETURNS hierarchyid
AS
BEGIN
RETURN hierarchyid::Parse([ô]/[ô] + REPLACE(@value, [ô].[ô], [ô]/[ô]) + [ô]/[ô])
END
GO

CREATE TABLE [dbo].[Table_1](
[NIVEIS] [varchar](50) NULL
) ON [PRIMARY]

INSERT [dbo].[Table_1] ([NIVEIS]) VALUES ([ô]10[ô])
INSERT [dbo].[Table_1] ([NIVEIS]) VALUES ([ô]10.1[ô])
INSERT [dbo].[Table_1] ([NIVEIS]) VALUES ([ô]10.1.1[ô])
INSERT [dbo].[Table_1] ([NIVEIS]) VALUES ([ô]10.1.1.1[ô])
INSERT [dbo].[Table_1] ([NIVEIS]) VALUES ([ô]4[ô])
INSERT [dbo].[Table_1] ([NIVEIS]) VALUES ([ô]4[ô])
INSERT [dbo].[Table_1] ([NIVEIS]) VALUES ([ô]4.1[ô])
INSERT [dbo].[Table_1] ([NIVEIS]) VALUES ([ô]4.1.1[ô])
INSERT [dbo].[Table_1] ([NIVEIS]) VALUES ([ô]5[ô])

SELECT
TOP 1000
[NIVEIS],
[dbo].fcs_HierarchyidValue(NIVEIS) ORDERBY
FROM [dbo].[Table_1]
ORDER BY [dbo].fcs_HierarchyidValue(NIVEIS)

WEBMASTER 14/10/2016 16:09:08
#468089
Vem cá, se você só remover o ponto final e deixar tudo como número ja nao resolve ?
JABA 14/10/2016 16:40:19
#468090
Um algorítimo que talvez pudesse resolver isso seria o seguinte:

Manter o primeiro ponto e eliminar os restantes, fazendo dele um número fracionário.

Ex:

De 10.1.1.1 viraria 10.111

OBS: Não é para atualizar os campos com esse novo formato, apenas fazer isso na memória mesmo, com uma função. Geralmente os bancos possuem Replace(para trocar caracteres), Mid(para percorrer strings), etc.
PLUGSOFTSM 14/10/2016 19:01:32
#468092
Poderia fazer assim

Select Codigo from Tabela order by (Case Charindex([ô].[ô],Codigo) When 0 Then Codigo Else Substring(Codigo,0, CharIndex([ô].[ô],Codigo)) End), Codigo

Deverá funcionar direitinho

Espero ter ajudado
Faça seu login para responder