使用MySQL的“IF EXISTS”

时间:2011-04-03 09:57:11

标签: mysql

以下是我想要使用的两个语句,但它们会返回错误消息:

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

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

问题是存在的,因为我使用PHP的PDO参数化,准备好的语句。但是,我也尝试手动执行此操作,但它确实无效。

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

5 个答案:

答案 0 :(得分:108)

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

将EXISTS子句转换为子查询,而不是IF函数

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

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

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

答案 1 :(得分:28)

我发现 RichardTheKiwi 这个例子非常有用。

如果你正在寻找像IF EXISTS (SELECT 1 ..) THEN ...

这样的东西,那就提供另一种方法

- 我可能在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

- 为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;

答案 2 :(得分:0)

选择if((SELECT count(*)FROM gdata_calendars WHERE group =?AND id =?),1,0);

有关详细说明,您可以访问here

答案 3 :(得分:0)

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

If Exists (...) Then ... End If; 
Myp过程中的

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

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

答案 4 :(得分:-9)

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