AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 41067
Accepted
Nathanael Weiss
Nathanael Weiss
Asked: 2013-04-28 00:09:43 +0800 CST2013-04-28 00:09:43 +0800 CST 2013-04-28 00:09:43 +0800 CST

Obtendo SELECT para retornar um valor constante, mesmo que zero linhas correspondam

  • 772

Considere esta declaração select:

SELECT *, 
       1 AS query_id 
FROM players 
WHERE username='foobar';

Ele retorna a coluna query_idcom valor 1junto com as outras colunas de um jogador.

Como alguém faria o SQL acima retornar pelo menos o query_idmesmo 1que o select não encontrasse nenhuma linha que corresponda?

BTW, é o PostgreSQL 8.4.

postgresql select
  • 5 5 respostas
  • 96777 Views

5 respostas

  • Voted
  1. Best Answer
    a_horse_with_no_name
    2013-04-28T00:24:02+08:002013-04-28T00:24:02+08:00
    SELECT col1, 
           col2, 
           col3, 
           1 AS query_id 
    FROM players 
    WHERE username='foobar'
    union all 
    select null,
           null,
           null,
           1
    where not exists (select 1 from players where username = 'foobar');
    

    Ou como alternativa ( pode ser mais rápido, pois não é necessária uma segunda subseleção):

    with qid (query_id) as (
       values (1)
    ) 
    select p.*, 
           qid.query_id
    from qid 
      left join players as p on (p.useranme = 'foobar');
    

    Você pode reescrever o acima para uma representação mais "compacta":

    select p.*, 
           qid.query_id
    from (values (1)) as qid (query_id)
      left join players as p on (p.useranme = 'foobar');
    

    Mas acho que o CTE explícito ( with...) é mais legível (embora isso esteja sempre nos olhos de quem vê).

    • 24
  2. David Aldridge
    2013-04-28T11:05:19+08:002013-04-28T11:05:19+08:00

    Se você está esperando apenas uma ou zero linhas de volta, isso também funcionaria:

    SELECT
      max(col1) col1,
      max(col2) col2, 
      1 AS query_id 
    FROM
      players 
    WHERE
      username='foobar';
    

    Isso retornará uma linha com todos os valores com nulo, exceto query_id, se nenhuma linha for encontrada.

    • 8
  3. Kirk Roybal
    2013-07-17T07:35:08+08:002013-07-17T07:35:08+08:00

    Chiming atrasado aqui, mas aqui está uma sintaxe que funciona (pelo menos na 9.2, não tentei versões anteriores).

    SELECT (COALESCE(a.*,b.*::players)).*
    FROM ( SELECT col1,  col2,  col3, 1 AS query_id 
           FROM players WHERE username='foobar' ) a
    RIGHT JOIN (select null col1, null col2, null col3, 1 col4) b
    ON a.query_id = b.col4;
    

    Só retornará a linha "em branco" se todo o conteúdo de "a" for nulo.

    Apreciar. /bithead

    • 4
  4. sol
    2021-04-02T14:14:15+08:002021-04-02T14:14:15+08:00

    eu precisava fazer algo parecido e meu cérebro não estava dando, então pesquisei e encontrei essa pergunta... pode ser simplificado mais?! :)

         WITH _ AS ( SELECT * FROM players
                             WHERE username = 'foobar' )
           , __ AS ( SELECT CASE WHEN EXISTS ( TABLE _ )
                                 THEN ( SELECT    _::players FROM _ )
                                 ELSE ( SELECT NULL::players )
                                  END _ )
       SELECT (__._).*
                    , 1 AS query_id
         FROM __
         ;
    
    • -1
  5. user86795
    2016-02-11T02:14:25+08:002016-02-11T02:14:25+08:00
    select isnull(column,1) from table
    
    • -2

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve