2010-11-09 13 views
8

In postgreSQL, come posso restituire una tabella contenente 0 se la mia tabella è vuota e una tabella contenente 1 se la mia tabella ha righe?Come restituire 0 se tabella vuota, 1 altrimenti

ho bisogno di farlo in SQL, non utilizzando qualsiasi altra lingua

+0

Si desidera restituire il valore * 0 o 1 se la tabella contiene righe? O vuoi restituire una tabella contenente solo una riga se ha righe e nulla se non lo fa? – Patrick

+0

Voglio restituire una tabella contenente il valore 1 se ci sono righe nella mia tabella e una tabella contenente 0 se non c'è nulla in questa tabella specifica che ho. – Spawn

+2

E 'assolutamente necessario restituire uno 0 o 1? Se si desidera solo un indicatore booleano, qualsiasi valore maggiore di 0 verrà mappato su true nella logica post-db. –

risposta

-5

Non credo che sia possibile utilizzando nient'altro che SQL. Perché non puoi usare qualsiasi altra lingua?

+1

Questo sarebbe stato meglio come commento – WattsInABox

0

forse questo è quello che stai cercando?

select min(c) from (
select count(*) c 
from mytab 
union 
select 1 
from mytab 
having count(*) > 1) 
13

Usa:

SELECT CASE 
     WHEN EXISTS (SELECT * FROM foo LIMIT 1) THEN 1 
     ELSE 0 
     END 

EDIT: Aggiunta LIMIT 1 per velocizzare query.

+2

Questo è così sbagliato! Questa query legge un'intera tabella per determinare se è vuota. Per il grande tavolo ci vorrebbero secoli! – Tometzky

+1

Potrei semplicemente aggiungere un "Top 1" per risolvere il problema? – GendoIkari

+0

Erm, perché non è SQLServer, limite 1? – GendoIkari

13

Potrebbe essere un hack, ma funziona.

SELECT count(*) FROM (SELECT 1 FROM table LIMIT 1) AS t; 
  • Il 1 selezionato nel sub-query potrebbe essere qualunque, è solo un supporto posto.
  • Il LIMIT 1 dovrebbe rendere la sottoquery molto veloce, indipendentemente dalla dimensione della tabella.

Modifica: Riscrivi un po '. L'uso precedente di LIMIT era sbagliato (non è stato d'aiuto su tabelle grandi come volevo).

2

Prova:

select sign(count(*)) from mytable 
+1

(*) è molto lento per le tabelle enormi – rmflow

0

Si può mettere questa richiesta in una stored procedure, con il nome della tabella come parametro:

CREATE OR REPLACE FUNCTION isEmpty(tableName text, OUT zeroIfEmpty integer) AS 
$func$ 
BEGIN 
EXECUTE format('SELECT COALESCE ((SELECT 1 FROM %s LIMIT 1),0)', tableName) 
INTO zeroIfEmpty; 
END 
$func$ LANGUAGE plpgsql; 

Poi gestiscono questa funzione come questa:

SELECT * FROM isEmpty('my_table_name'); 

Quindi puoi chiamarlo con qualsiasi nome del tuo tavolo

Problemi correlati