Gebruik van MySQL’s “IF BESTAAT”

Hier zijn twee uitspraken die ik zou willen werken, maar die foutmeldingen opleveren:

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

en

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

De vraagtekens staan daar omdat ik geparametriseerde, voorbereide statements gebruik met PHP’s PDO. Ik heb echter ook geprobeerd dit handmatig uit te voeren met gegevens, en het werkt echt niet.

Hoewel ik graag zou willen weten waarom elk van hen niet werkt, zou ik liever de eerste query gebruiken als deze kan worden uitgevoerd.


Antwoord 1, autoriteit 100%

U kunt het IF-regelblok niet BUITEN de functies gebruiken. Dus dat heeft invloed op je beide vragen.

Verander de EXISTS-component in een subquery in plaats daarvan binnen een IF-functie

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

In feite worden booleans geretourneerd als 1 of 0

SELECT EXISTS(
         SELECT *
         FROM gdata_calendars
         WHERE `group` =  ? AND id = ?)

Antwoord 2, autoriteit 27%

Ik vond het voorbeeld RichardTheKiwibehoorlijk informatief.

Gewoon om een andere benadering aan te bieden als u op zoek bent naar iets als IF EXISTS (SELECT 1 ..) THEN ...

— wat ik zou kunnen schrijven in 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

— herschreven voor 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;

Antwoord 3

Het geaccepteerde antwoord werkt goed en men kan ook gewoon de

. gebruiken

If Exists (...) Then ... End If; 

syntaxis in Mysql-procedures (indien acceptabel voor de omstandigheden) en het zal zich gedragen zoals gewenst/verwacht. Hier is een link naar een uitgebreidere bron/beschrijving: https://dba.stackexchange .com/questions/99120/if-exists-then-update-else-insert

Een probleem met de oplossing van @SnowyR is dat het zich niet echt gedraagt als “Als bestaat” in die zin dat de (Selecteer 1 = 1 …) subquery in sommige omstandigheden meer dan één rij kan retourneren en dus een fout. Ik heb geen toestemming om rechtstreeks op dat antwoord te reageren, dus ik dacht dat ik het hier zou vermelden voor het geval het iemand anders de problemen bespaart die ik heb ervaren en zodat anderen misschien weten dat het geen gelijkwaardige oplossing is voor MSSQLServer “indien aanwezig”!


Antwoord 4

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

Voor gedetailleerde uitleg kunt u hier


Antwoord 5

if exists(select * from db1.table1 where sno=1 )
begin
select * from db1.table1 where sno=1 
end
else if (select * from db2.table1 where sno=1 )
begin
select * from db2.table1 where sno=1 
end
else
begin
print 'the record does not exits'
end

Other episodes