2010-11-09 29 views
8

En postgreSQL, ¿cómo puedo devolver una tabla que contenga 0 si mi tabla está vacía y una tabla que contiene 1 si mi tabla tiene filas?Cómo devolver 0 si la tabla está vacía, 1 de lo contrario

tengo que hacerlo en SQL, no usar cualquier otro idioma

+0

¿Desea devolver el * valor * 0 o 1 si su tabla tiene filas? ¿O desea devolver una tabla que contenga solo una fila si tiene filas, y nada si no lo hace? – Patrick

+0

Quiero devolver una tabla que contiene el valor 1 si hay filas en mi tabla y una tabla que contiene 0 si no hay nada en esta tabla específica que tengo. – Spawn

+2

¿Es absolutamente necesario devolver un 0 o 1? Si solo quiere un indicador booleano, cualquier valor mayor que 0 se correlacionará con verdadero en su lógica post-db. –

Respuesta

-5

No creo que eso sea posible usando nada más que SQL. ¿Por qué no puedes usar otro idioma?

+1

Esto hubiera sido mejor como un comentario – WattsInABox

0

tal vez esto es lo que estás buscando?

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

Uso:

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

EDITAR: Añadido LIMIT 1 para acelerar la consulta.

+2

¡Esto está tan mal! Esta consulta lee una tabla completa para determinar si está vacía. Para la gran mesa, ¡tardaría años! – Tometzky

+1

¿Podría simplemente agregar un "Top 1" y luego arreglarlo? – GendoIkari

+0

Erm, porque no es SQLServer, Límite 1? – GendoIkari

13

Podría ser un truco, pero funciona.

SELECT count(*) FROM (SELECT 1 FROM table LIMIT 1) AS t; 
  • El 1 seleccionado en el sub-consulta podría ser lo que sea, es sólo un marcador de posición.
  • El LÍMITE 1 debe hacer que la sub consulta sea muy rápida, independientemente del tamaño de la tabla.

Editar: Reescribió un poco. El uso anterior de LIMIT fue incorrecto (no me ayudó en las tablas grandes como lo pretendía).

2

Probar:

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

recuento (*) es muy lento para tablas enormes – rmflow

0

Usted puede poner esta solicitud en un procedimiento almacenado, con el nombre de tabla como parámetro:

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; 

A continuación, ejecute esta función como esta:

SELECT * FROM isEmpty('my_table_name'); 

Para que pueda llamarlo con el nombre de su tabla

Cuestiones relacionadas