Saltar al contenido

SQL: Devuelve “true”si existe una lista de registros?

Esta es la contestación más correcta que te podemos compartir, sin embargo mírala detenidamente y analiza si se puede adaptar a tu trabajo.

Solución:

Dada su pregunta actualizada, estas son las formas más simples:

Si ProductID es único lo que quieres

SELECT COUNT(*) FROM Products WHERE ProductID IN (1, 10, 100)

y luego verifique ese resultado contra 3la cantidad de productos que está consultando (esta última parte se puede hacer en SQL, pero puede ser más fácil hacerlo en C# a menos que esté haciendo aún más en SQL).

Si ProductID no es único es

SELECT COUNT(DISTINCT ProductID) FROM Products WHERE ProductID IN (1, 10, 100)

Cuando se pensaba que la pregunta requería devolver filas cuando todas ProductIds están presentes y ninguno en otro caso:

SELECT ProductId FROM Products WHERE ProductID IN (1, 10, 100) AND ((SELECT COUNT(*) FROM Products WHERE ProductID IN (1, 10, 100))=3)

o

SELECT ProductId FROM Products WHERE ProductID IN (1, 10, 100) AND ((SELECT COUNT(DISTINCT ProductID) FROM Products WHERE ProductID IN (1, 10, 100))=3)

si realmente tiene la intención de hacer algo con los resultados. De lo contrario, el simple SELECT 1 WHERE (SELECT ...)=3 hará lo que otras respuestas han declarado o implicado.

Así es como lo hago normalmente:

Sólo reemplazar su consulta con esta declaración SELECT * FROM table WHERE 1

   SELECT
      CASE WHEN EXISTS 
      (
            SELECT * FROM table WHERE 1
      )
      THEN 'TRUE'
      ELSE 'FALSE'
   END

@Mark Hurd, gracias por señalar el error.

esto funcionará (si está utilizando Postgresql, Sql Server 2008):

create table products
(
product_id int not null
);



insert into products values(1),(2),(10),(100);

SELECT 
    CASE 
        WHEN EXISTS(
             SELECT 1 
             FROM (values(1),(10),(100)) as x(id) 
             WHERE x.id NOT IN (select product_id from products))
        THEN 0 --'NOT ALL'

        ELSE 1 -- 'ALL'
    END

Si está utilizando MySQL, cree una tabla de memoria temporal (luego complete 1,10,100 allí):

create table product_memory(product_id int) engine=MEMORY;

insert into product_memory values(1),(10),(100);

SELECT 
    CASE 
        WHEN EXISTS(
             SELECT 1 
             FROM product_memory
             WHERE product_memory.id NOT IN (select product_id from products))
        THEN 0 -- 'NOT ALL'

        ELSE 1 -- 'ALL'
    END

En su código C#:

bool isAllExist = (int)(new SqlCommand(queryHere).ExecuteScalar()) == 1;

[EDIT]

¿Cómo puedo escribir una consulta que devolverá una fila si existen todas las identificaciones de productos y ninguna fila si no existen una o más identificaciones de productos?

Con respecto a devolver una fila (singular) si existen todas las filas, y sin fila para ser devuelto si uno o más id de producto no existe:

MySql:

SELECT 1
WHERE 
    NOT EXISTS(
        SELECT 1
             FROM product_memory
             WHERE product_memory.id NOT IN (select product_id from products) )

Posgresql, Servidor Sql 2008:

SELECT 1
WHERE 
    NOT EXISTS(            
        SELECT 1 
        FROM (values(1),(10),(100)) as x(id) 
        WHERE x.id NOT IN (select product_id from products) )

Luego en tu código C#:

var da = new SqlDataAdapter(queryhere, connectionhere);
var dt = new DataTable();
da.Fill(dt);

if (dt.Rows.Count > 0) 
    return true; 
else 
    return false;

O simplemente acortar la condición:

return dt.Rows.Count > 0;

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *