以下是我想要使用的两个语句,但它们会返回错误消息:
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参数化,准备好的语句。但是,我也尝试手动执行此操作,但它确实无效。
虽然我想知道为什么每个都不起作用,但如果可以使用它,我宁愿使用第一个查询。
答案 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