MySQL“ IF EXISTS”的用法

Usage of MySQL's “IF EXISTS”

这是我要使用的两条语句,但是它们返回错误消息:

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

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

出现问号是因为我在PHP的PDO中使用了参数化的,准备好的语句。 但是,我也尝试过手动使用数据执行此操作,但这确实不起作用。

虽然我想知道为什么每个都不起作用,但如果可以使第一个查询起作用,我希望使用第一个查询。


您不能使用功能的IF控制块OUTSIDE。这样会影响您的两个查询。

将EXISTS子句改为IF函数中的子查询

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

实际上,布尔值返回为1或0

1
2
3
4
SELECT EXISTS(
         SELECT *
         FROM gdata_calendars
         WHERE `group` =  ? AND id = ?)


我发现RichardTheKiwi的示例非常有用。

如果您正在寻找类似IF EXISTS (SELECT 1 ..) THEN ...之类的东西,则只是提供另一种方法

-我可能会在MSSQL中写的内容

1
2
3
4
5
6
7
8
9
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

-为MySQL重写

1
2
3
4
5
6
7
8
9
10
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;


接受的答案效果很好,也可以使用

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

Mysql过程中的语法(如果情况允许),它将按照期望/预期的方式运行。这是更详尽的源代码/描述的链接:https://dba.stackexchange.com/questions/99120/if-exists-then-update-else-insert

@SnowyR解决方案的一个问题是,它的行为实际上不像"如果存在",因为在某些情况下(Select 1 = 1 ...)子查询可能返回多个行,因此会产生错误。我没有直接直接回答该问题的权限,因此我想在这里提及它,以免它避免其他人遇到我的麻烦,因此其他人可能知道这不是MSSQLServer"如果存在"的等效解决方案!


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

有关详细说明,请访问此处


1
2
3
4
5
6
7
8
9
10
11
12
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