ORDENAR CAMPO TIPO TEXTO COM VERSIONAMENTO

 Tópico anterior Próximo tópico Novo tópico

ORDENAR CAMPO TIPO TEXTO COM VERSIONAMENTO

SQL / DATABASE

 Compartilhe  Compartilhe  Compartilhe
#491807 - 11/12/2019 22:00:49

WCOSTA
VASSOURAS
Cadast. em:Dezembro/2003


Membro da equipe
Galera,
Estou com uma dificuldade de ordenar informaes contidas em uma Database MySQL, a questo que h uma campo chamado versao [Char(50)], que armazena as verses dos software que os cliente registram. At tudo beleza, mas o problema na hora de ordenar pela verso seja em ASC ou DESC, pois o entedimento o motor da DB ou do Software que 1.2>1.10 (sob o ponto de vista lgico de ordenao na forma de string, t beleza), entretanto gostaria que o 1.10, no fosse confundido com 1.1 e que ordenasse da seguinte forma 1.10>1.9>1.8>...>1.0.
Atualmente a SELECT est assim
[]SELECT * FROM dados_clientes ORDER BY versao DESC, data_registro DESC, usuario ASC[];  

Ser necessrio alterar o tipo do campo ou h alguma forma de ordenar atravs de comandos do prprio MySQL? J dei uma olhada na documentao e apenas encontrei algo, que poderia auxiliar, o comando FIELD, mas no viabilizei.

AntSoft Systems On Demand



#491817 - 12/12/2019 15:59:19

WCOSTA
VASSOURAS
Cadast. em:Dezembro/2003


Membro da equipe

Última edição em 12/12/2019 18:41:23 por WCOSTA

Agora cheguei a uma Select que me resolve em parte o problema, mas ainda no a soluo
  []SELECT *, REPLACE(versao, [].[],[][]) AS versaoformat  FROM dados_clientes ORDER BY versaoformat+0 DESC, data_registro DESC, usuario ASC[];  

Quando tenho, por exemplo 1.9.150.1901 e a verso mais nova 1.10.132.1902, funciona, mas quando a verso ainda no recebeu a Minor e a Build (2.0), no funciona, pois 191501901+0 e maior que 20+0


AntSoft Systems On Demand



#491819 - 12/12/2019 18:55:29

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Creio que voc est falando de semntica de versionamento. E nesse caso, voc vai precisar de uma funo(FUNCTION) que cubra esse cenrio.

CREATE FUNCTION [dbo].[SemanticVersion] (
    @Version nvarchar(50)
)
RETURNS nvarchar(255)

AS
BEGIN

    DECLARE @hyphen int = CHARINDEX([]-[], @version)
    SET @Version = REPLACE(@Version, []*[], [] [])
    DECLARE
        @left nvarchar(50) = CASE @hyphen WHEN 0 THEN @version ELSE SUBSTRING(@version, 1, @hyphen-1) END,
        @right nvarchar(50) = CASE @hyphen WHEN 0 THEN NULL ELSE SUBSTRING(@version, @hyphen+1, 50) END,
        @normalized nvarchar(255) = [][],
        @buffer int = 8

    WHILE CHARINDEX([].[], @left) > 0 BEGIN
        SET @normalized = @normalized + CASE ISNUMERIC(LEFT(@left, CHARINDEX([].[], @left)-1))
            WHEN 0 THEN LEFT(@left, CHARINDEX([].[], @left)-1)
            WHEN 1 THEN REPLACE(STR(LEFT(@left, CHARINDEX([].[], @left)-1), @buffer), SPACE(1), []0[])
        END  + [].[]
        SET @left = SUBSTRING(@left, CHARINDEX([].[], @left)+1, 50)
    END
    SET @normalized = @normalized + CASE ISNUMERIC(@left)
        WHEN 0 THEN @left
        WHEN 1 THEN REPLACE(STR(@left, @buffer), SPACE(1), []0[])
    END

    SET @normalized = @normalized + []-[]
    IF (@right IS NOT NULL) BEGIN
        WHILE CHARINDEX([].[], @right) > 0 BEGIN
            SET @normalized = @normalized + CASE ISNUMERIC(LEFT(@right, CHARINDEX([].[], @right)-1))
                WHEN 0 THEN LEFT(@right, CHARINDEX([].[], @right)-1)
                WHEN 1 THEN REPLACE(STR(LEFT(@right, CHARINDEX([].[], @right)-1), @buffer), SPACE(1), []0[])
            END  + [].[]
            SET @right = SUBSTRING(@right, CHARINDEX([].[], @right)+1, 50)
        END
        SET @normalized = @normalized + CASE ISNUMERIC(@right)
            WHEN 0 THEN @right
            WHEN 1 THEN REPLACE(STR(@right, @buffer), SPACE(1), []0[])
        END
    END ELSE
        SET @normalized = @normalized + []zzzzzzzzzz[]

    RETURN @normalized

END


Vrios testes para isso:

SELECT CASE WHEN dbo.SemanticVersion([]1.0.0-alpha[]) < dbo.SemanticVersion([]1.0.0-alpha.1[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]1.0.0-alpha.1[]) < dbo.SemanticVersion([]1.0.0-alpha.beta[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]1.0.0-alpha.beta[]) < dbo.SemanticVersion([]1.0.0-beta[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]1.0.0-beta[]) < dbo.SemanticVersion([]1.0.0-beta.2[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]1.0.0-beta.2[]) < dbo.SemanticVersion([]1.0.0-beta.11[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]1.0.0-beta.11[]) < dbo.SemanticVersion([]1.0.0-rc.1[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]1.0.0-rc.1[]) < dbo.SemanticVersion([]1.0.0[]) THEN []Success[] ELSE []Failure[] END


SELECT CASE WHEN dbo.SemanticVersion([]1.0.0-*[]) <= dbo.SemanticVersion([]1.0.0[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]1.0.*[]) <= dbo.SemanticVersion([]1.0.0[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]1.*[]) <= dbo.SemanticVersion([]1.0.0[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]*[]) <= dbo.SemanticVersion([]1.0.0[]) THEN []Success[] ELSE []Failure[] END

SELECT CASE WHEN dbo.SemanticVersion([]1.0.0-*[]) <= dbo.SemanticVersion([]1.0.0[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]1.0.1-*[]) > dbo.SemanticVersion([]1.0.0[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]1.0.1-*[]) <= dbo.SemanticVersion([]1.0.1[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]1.1.*[]) > dbo.SemanticVersion([]1.0.9[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]1.1.*[]) <= dbo.SemanticVersion([]1.2.0[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]1.*[]) <= dbo.SemanticVersion([]2.0.0[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]1.*[]) > dbo.SemanticVersion([]0.9.9-beta-219[]) THEN []Success[] ELSE []Failure[] END
SELECT CASE WHEN dbo.SemanticVersion([]*[]) <= dbo.SemanticVersion([]0.0.1-alpha-1[]) THEN []Success[] ELSE []Failure[] END


_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


Resposta escolhida #491820 - 12/12/2019 20:18:52

JABA
CABO FRIO
Cadast. em:Agosto/2005


Última edição em 12/12/2019 20:20:53 por JABA

Tente assim:

SELECT * FROM dados_clientes ORDER BY INET_ATON(SUBSTRING_INDEX(CONCAT(versao,[].0.0.0[]),[].[],4))





_______________________________________________________________________________________________

Se a alma ou esprito so imateriais, como eles fazem para se localizar quando o corpo est em movimento?



#491822 - 12/12/2019 21:53:39

WCOSTA
VASSOURAS
Cadast. em:Dezembro/2003


Membro da equipe

Última edição em 12/12/2019 21:54:26 por WCOSTA

Kerplunk, fantstica sua sada, fiz umas adaptaes para MySQL e confesso que parei, pois daria muito trabalho, pois preciso de algo, mas rpido e funcional a nvel de SELECT, mesmo, sem Function. Sem desmerecer sua ajuda, mas acho que algo mais funcional

Grande Jaba, soluo assertiva e simples, apenas uma modificao, em relao ao formato do versionamento
Sua Soluo
Citação:
  SELECT * FROM dados_clientes ORDER BY INET_ATON(SUBSTRING_INDEX(CONCAT(versao,[].0.0.0[]),[].[],4))


Minha soluo adaptada
SELECT * FROM dados_clientes ORDER BY INET_ATON(SUBSTRING_INDEX(CONCAT(versao,[]0.00.000.0000[]),[].[],4))  

Cada verso composta assim 1.0.0.0, mas pode ser 1.9.0.0, mas ainda pode 1.10.345.1632
Funcionou belezinha, como no posso pontuar os dois, pontuarei por um critrio meu.


AntSoft Systems On Demand



 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por WCOSTA em 12/12/2019 21:54:51