使用 MySQL 的“ IF EXISTS”

下面是我希望使用的两个语句,但它们返回错误消息:

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 中使用了参数化的、准备好的语句。然而,我也尝试过手动执行这些数据,但它确实不起作用。

虽然我想知道为什么它们每个都不能工作,但是如果可以工作的话,我更愿意使用第一个查询。

384784 次浏览

不能使用函数的 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 = ?)

我发现这个例子 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;
SELECT IF((
SELECT count(*) FROM gdata_calendars
WHERE `group` =  ? AND id = ?)
,1,0);

详细说明请访问 给你

接受的答案工作得很好,人们也可以只使用

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

Mysql 过程中的语法(如果环境可以接受的话) ,并且它将按照期望/预期的方式运行。这里有一个更全面的来源/描述的链接: https://dba.stackexchange.com/questions/99120/if-exists-then-update-else-insert

@ SnowyR 的解决方案的一个问题是,它的行为并不像“ If Exists”,因为(Select 1 = 1...)子查询在某些情况下可能返回多于一行,所以它会出错。我没有权限直接回答这个问题,所以我想我应该在这里提到它,以防它省去了别人我经历的麻烦,所以其他人可能知道它不是一个等价的解决方案 MSSQLServer“如果存在”!

如果表具有自动递增的主键,则可以使用 REPLACE INTO ... VALUES

SELECT @id := id FROM tableName WHERE fieldName='criteria value' LIMIT 1;
REPLACE INTO tableName(id, fieldName, col1, col2)
VALUES (@id, 'criteria value', 'value1', 'value2')

如果 select 语句返回 NULL,则插入一个新行。 否则,如果找到一行,它将使用键 @id更新该行。