none
Dúvida em um Select RRS feed

  • Pergunta

  •  

    Boa noite,

     

    Estou com uma dúvida em um select.

    Vamos imaginar a seguinte tabela:

    Codigo Cor
    1 Vermelho
    2 Amarelo
    3 Verde
    4 Outra
    5 Laranja
    6 Azul

     

    Preciso dar um select organizando as cores por ordem alfabética, mas quando for imprimir isso na tela, deixar a que está escrito "Outra" por último, ficando assim:

     

    2 Amarelo
    6 Azul
    5 Laranja
    3 Verde
    1 Vermelho
    4 Outra

     

    A principio eu sei como organizar:

     

    SELECT * FROM tabela order by cor

     

    Mas, como devem saber, não daria certo pois o resultado não seria o esperado.

     

    Fico no aguardo,

    terça-feira, 8 de julho de 2008 21:30

Respostas

  • Faz 2 select com um union no meio

     

    Code Snippet

    SELECT CorId,Nome,NULL AS Ordem FROM Cores WHERE Nome <> 'Outro'

    UNION

    SELECT CorId,Nome,36667 AS Ordem FROM Cores WHERE Nome = 'Outro'

     

     

    Isso deve resolver

     

     

    A outra forma, talvez ate mais adequada é criar uma coluna aonde vc devine a ordem e pra "outra" vc poe o valor maximo.

     

    Ficaria algo assim

     

     

    6 -- Azul -- NULL
    1 -- Branco -- NULL
    2 -- Preto -- NULL

    4 -- Roxo -- NULL
    3 -- Vermelho -- NULL
    5 -- Outro -- 32566

     

    E o select fica assim

     

    Code Snippet

    SELECT * FROM Cores ORDER BY Ordem,Nome

     

     

    O detalhe eh o seguinte mesmo que vc colocar algum valor pra "Ordem" ele mantem a ordem alphabetica e depois ele organiza pelos numeros. veja:

     

    6 -- Azul -- NULL
    1 -- Branco -- NULL
    2 -- Preto -- NULL
    3 -- Vermelho -- NULL

    4 -- Roxo -- 3
    5 -- Outro -- 32566

    terça-feira, 8 de julho de 2008 22:01
    Moderador
  • Boa noite a todos,

     

    Entendi a solução do ViewState, porém não é necessário criar este campo falso, apenas faça assim:

     

    Code Snippet

    SELECT Codigo, Cor FROM Cores WHERE Codigo <> 4

    UNION ALL

    SELECT Codigo, Cor FROM Cores WHERE Codigo = 4

     

    Apesar de ser mais focado em SQL Server, acredito que este exemplo dará certo no Access também.
    Se vc perceber, pela lógica, este exemplo dará certo pois sempre trará primeiramente aqueles que forem diferentes da cor OUTRA (que possui o código 4) e por último irá juntar com esta linha - OUTRA.

     

    Veja se deu certo e, qualquer dúvida retorne.

     

    [ ]s.

     

    quarta-feira, 9 de julho de 2008 00:32

Todas as Respostas

  • Faz 2 select com um union no meio

     

    Code Snippet

    SELECT CorId,Nome,NULL AS Ordem FROM Cores WHERE Nome <> 'Outro'

    UNION

    SELECT CorId,Nome,36667 AS Ordem FROM Cores WHERE Nome = 'Outro'

     

     

    Isso deve resolver

     

     

    A outra forma, talvez ate mais adequada é criar uma coluna aonde vc devine a ordem e pra "outra" vc poe o valor maximo.

     

    Ficaria algo assim

     

     

    6 -- Azul -- NULL
    1 -- Branco -- NULL
    2 -- Preto -- NULL

    4 -- Roxo -- NULL
    3 -- Vermelho -- NULL
    5 -- Outro -- 32566

     

    E o select fica assim

     

    Code Snippet

    SELECT * FROM Cores ORDER BY Ordem,Nome

     

     

    O detalhe eh o seguinte mesmo que vc colocar algum valor pra "Ordem" ele mantem a ordem alphabetica e depois ele organiza pelos numeros. veja:

     

    6 -- Azul -- NULL
    1 -- Branco -- NULL
    2 -- Preto -- NULL
    3 -- Vermelho -- NULL

    4 -- Roxo -- 3
    5 -- Outro -- 32566

    terça-feira, 8 de julho de 2008 22:01
    Moderador
  • Boa noite...

     

    Obrigado por responder...

     

    No meu caso, a mais viável seria a primeira opção que você passou... tentei aqui, mas não funcionou.... na verdade ficou como se eu tivesse colocado um select simples como por exemplo:

    SELECT * FROM TBLCores ORDER BY NomeCor

     

    Veja como fiz...

     

    Code Snippet

      ' ## Retorna as Cores cadastradas
      Set cmdVerificaCores = Server.CreateObject("ADODB.Command")
      cmdVerificaCores.ActiveConnection = DataCores
      cmdVerificaCores.CommandText = "SELECT * FROM TBLCores WHERE NomeCor <> 'Outra' Union SELECT * FROM TBLCores WHERE NomeCor = 'Outra'"
      cmdVerificaCores.CommandType = 1
      Set rsVerificaCores = Server.CreateObject("ADODB.Recordset")
      rsVerificaCores.Open cmdVerificaCores, , 3, 3

     

    do While rsVerificaCores.EOF

     

    response.write rsVerificaCores("NomeCor") & "<br>"

     

    rsVerificaCores.movenext

    loop

     

    Estou errando em algum lugar?
    terça-feira, 8 de julho de 2008 22:35
  • Que banco de dados vc esta usando???

     

    terça-feira, 8 de julho de 2008 22:38
    Moderador
  • Eder,

    Qual a versão do seu SQL Server?

     

    [ ]s.

     

    terça-feira, 8 de julho de 2008 22:41
  • Ainda não sei trabalhar com SQLServer, infelizmente estou usando "Banco" access.

     

     

    terça-feira, 8 de julho de 2008 22:51
  • Tente a query corrigida no meu post original, esqueci de colocar algumas coisas antes, e isso tornava o codigo inviavel.

     

    terça-feira, 8 de julho de 2008 22:52
    Moderador
  • Certo.. mas.. sem ter que criar a coluna Ordem na tabela... não tem como fazer?? seguindo o raciocínio anterior?

    terça-feira, 8 de julho de 2008 22:55
  • No exemplo que eu fiz eu crio a coluna mas de mentira, ela não precisa estar na tabela

     

    Code Snippet

    SELECT CorId,Nome,NULL AS Ordem FROM Cores WHERE Nome <> 'Outro'

    UNION

    SELECT CorId,Nome,36667 AS Ordem FROM Cores WHERE Nome = 'Outro'

     

     

    terça-feira, 8 de julho de 2008 22:57
    Moderador
  • Boa noite a todos,

     

    Entendi a solução do ViewState, porém não é necessário criar este campo falso, apenas faça assim:

     

    Code Snippet

    SELECT Codigo, Cor FROM Cores WHERE Codigo <> 4

    UNION ALL

    SELECT Codigo, Cor FROM Cores WHERE Codigo = 4

     

    Apesar de ser mais focado em SQL Server, acredito que este exemplo dará certo no Access também.
    Se vc perceber, pela lógica, este exemplo dará certo pois sempre trará primeiramente aqueles que forem diferentes da cor OUTRA (que possui o código 4) e por último irá juntar com esta linha - OUTRA.

     

    Veja se deu certo e, qualquer dúvida retorne.

     

    [ ]s.

     

    quarta-feira, 9 de julho de 2008 00:32
  • Certo... funcionou como eu queria... valeu pessoal....

    quarta-feira, 9 de julho de 2008 14:53
  • O problema de vc usar o Codigo como forma de filtro é que vc tem que garantir que 4 é sempre o "Outra", e isso pode não ser verdade.

    Fora isso como fica a ordem alfabetica???

     

    quarta-feira, 9 de julho de 2008 15:14
    Moderador