我不断收到此语法错误,但在与其他示例进行比较时发现它没有任何问题。
if EXISTS (select 1 from City where name = 'Perth')
THEN Print 'Record exits - Update'
ELSE Print 'Record doesn''t exist - Insert'
我发现错误:
#1064 - You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near 'if EXISTS (select
1 from City where name = 'Perth') THEN Print 'Record e' at line 1
我在zend cloud和普通的phpmyadmin mysql 5
上都得到了这个答案 0 :(得分:2)
这实际上并不是一个有效的MySQL查询。看起来您正在尝试将SQL与您希望根据查询是否存在而显示输出的方式混合在一起。您可以使用它来返回SQL中是否存在Perth
:
SELECT EXISTS(SELECT 1 FROM City WHERE name = 'Perth')
这将返回1
或0
,然后您可以使用服务器端脚本进行解析。它给你一个语法错误的原因是因为MySQL IF
语句采用IF(condition, <action if true>, <action if false>)
形式,没有使用THEN
或ELSE
(在编程语言中很常见) 。此外,MySQL没有明确的PRINT
语句,但您可以使用SELECT
在某种程度上完成上述要求(请注意,我们可以删除EXISTS
,因为如果结果没有返回):
SELECT IF(
(SELECT 1 FROM City WHERE name = 'Perth'),
(SELECT 'Record exists - update'),
(SELECT 'Record does not exist - Insert')
)
答案 1 :(得分:1)
您需要按照以下方式使用“选择”代替print
select IF((select 1 from city where name='Perth'),
'Record exits - Update','Record does not exist - Insert');
SQL Fiddle Demo。以下显示了在select Statement
中使用IF
IF((select 1 from city where name='Perth'),
'Record exits - Update','Record does not exist - Insert');
IF
包含两条消息。
首先:'Record exits - Update'
第二:'Record does not exist - Insert'
如果(select 1 from city where name='Perth')
有一些结果(相当于EXISTS),则会打印第一条消息,否则您将收到第二条消息
答案 2 :(得分:0)
另一种方法:使用分组功能将始终返回记录。如果没有要操作的记录,则按功能分组的结果将为NULL
。您可以将其用作决策机制。
postgres=# create table city(name text);
CREATE TABLE
postgres=#
postgres=# select COALESCE( max('Record exists - Update'), 'Record doesn''t exist - Insert' ) as state
postgres-# from city
postgres-# where name = 'Perth';
state
-------------------------------
Record doesn't exist - Insert
(1 row)
postgres=#
postgres=# insert into city values('Perth');
INSERT 0 1
postgres=#
postgres=# select COALESCE( max('Record exists - Update'), 'Record doesn''t exist - Insert' ) as state
postgres-# from city
postgres-# where name = 'Perth';
state
------------------------
Record exists - Update
(1 row)