Uso de "SI EXISTE" de MySQL

Resuelto C. E. asked hace 13 años • 5 respuestas

Aquí hay dos declaraciones con las que me gustaría trabajar, pero que devuelven mensajes de error:

IF EXISTS (SELECT * FROM gdata_calendars WHERE `group` =  ? AND id = ?) SELECT 1 ELSE SELECT 0

y

IF ((SELECT COUNT(*) FROM gdata_calendars WHERE `group` =  ? AND id = ?) > 0)  SELECT 1 ELSE SELECT 0;

Los signos de interrogación están ahí porque uso declaraciones parametrizadas y preparadas con PDO de PHP. Sin embargo, también intenté ejecutar esto con datos manualmente y realmente no funciona.

Si bien me gustaría saber por qué cada una de ellas no funciona, preferiría utilizar la primera consulta si se puede hacer que funcione.

C. E. avatar Apr 03 '11 16:04 C. E.
Aceptado

No puede utilizar el bloque de control IF FUERA de las funciones. Eso afecta a ambas consultas.

Convierta la cláusula EXISTS en una subconsulta en lugar de dentro de una función IF

SELECT IF( EXISTS(
             SELECT *
             FROM gdata_calendars
             WHERE `group` =  ? AND id = ?), 1, 0)

De hecho, los valores booleanos se devuelven como 1 o 0.

SELECT EXISTS(
         SELECT *
         FROM gdata_calendars
         WHERE `group` =  ? AND id = ?)
RichardTheKiwi avatar Apr 03 '2011 10:04 RichardTheKiwi

El ejemplo de RichardTheKiwi me pareció bastante informativo.

Solo para ofrecer otro enfoque si estás buscando algo comoIF EXISTS (SELECT 1 ..) THEN ...

-- lo que podría escribir en MSSQL

IF EXISTS (SELECT 1 FROM Table WHERE FieldValue='')
BEGIN
    SELECT TableID FROM Table WHERE FieldValue=''
END
ELSE
BEGIN
    INSERT INTO TABLE(FieldValue) VALUES('')
    SELECT SCOPE_IDENTITY() AS TableID
END

-- reescrito para MySQL

IF (SELECT 1 = 1 FROM Table WHERE FieldValue='') THEN
BEGIN
    SELECT TableID FROM Table WHERE FieldValue='';
END;
ELSE
BEGIN
    INSERT INTO Table (FieldValue) VALUES('');
    SELECT LAST_INSERT_ID() AS TableID;
END;
END IF;
SnowyR avatar Feb 19 '2014 18:02 SnowyR