ORDENAR STRING CAPITULADA
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.
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.
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.
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.
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)
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)
Vem cá, se você só remover o ponto final e deixar tudo como número ja nao resolve ?
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.
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.
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
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