我在mysql中有一个像这样的表(id是主键):
id | name | age
1 | John | 46
2 | | 56
3 | Jane | 25
现在我想只在名称为空时更新名称。如果该值不为空,则应使用新ID复制该行,否则应更新该名称。
我认为可以使用if语句完成,但它不起作用。
if((select `name` from `table1` where `id` = 3) = '',
update `table1` set `name`='ally' where `id` = 3,
insert into `table1` (`id`,`name`,`age`) values
(4, 'ally', select `age` from `table1` where `id` = 3))
编辑:
随着斯宾塞的回答,我在代码中使用了if。 (但我仍然想要一种方法来做一个单独的mysql查询。)
db.set_database('database1')
cursor = db.cursor()
query = "select IF(CHAR_LENGTH(name)>0,1,0) from table1 where id = {0}".format(id)
cursor.execute(query)
val1 = cursor.fetchone()
if val1[0]:
query = "INSERT INTO `table1` (`id`,`name`,`age`) SELECT {0},{1},`age` FROM `table1` WHERE `id` = {2}".format(new_id, name, id)
cursor.execute(query)
else:
query = "update `table1` set `name` = '{0}' where `id` = {1}".format(name, id)
cursor.execute(query)
db.commit()
答案 0 :(得分:1)
如果你这样做:
select t.*,
if(
EXISTS(select n.name from table1 n where n.id = 2 and NULLIF(n.name, '') is null) ,
'true',
'false'
) from table1 t
if语句返回" true",因为在你的表中存在行,其中id = 2且name为空。
就像这个例子一样,你可以编辑你的查询:
if(
EXISTS(select n.name from table1 n where n.id = 3 and NULLIF(n.name, '') is null),
update `table1` set `name`='ally' where `id` = 3,
insert into `table1` (`id`,`name`,`age`) values
(4, 'ally', select `age` from `table1` where `id` = 3)
)
答案 1 :(得分:1)
IF
不是有效的MySQL语句(在MySQL存储程序的上下文之外)。
要执行此操作,您需要两个语句。
假设零长度字符串和NULL值都是条件,您可以考虑为"空" ...
要有条件地尝试更新name
字段,您可以执行以下操作:
UPDATE table1 t
SET t.name = IF(CHAR_LENGTH(t.name)>0,t.name,'ally')
WHERE t.id = 3 ;
IF
表达式测试列的当前值是否为"不为空"。如果它不为空,则表达式返回列的当前值,从而导致"无更新"价值。如果列为空,则表达式返回' ally'。
你需要一个单独的声明来尝试INSERT:
修改强>
这不是正确的,而是在现有行成功UPDATE
...之后。 INSERT的尝试可能需要先运行,
<击> 撞击>
<击>INSERT INTO table1 (id,name,age)
SELECT 4 AS id, 'ally' AS name, t.age
FROM table1 t
WHERE t.id = 3
AND CHAR_LENGTH(t.name)>0;
击> <击> 撞击>
我们需要在WHERE子句中进行条件测试,以防止在我们不需要插入行时返回行。如果值'ally'
...
使用CHAR_LENGTH >0
是一个方便的测试,对于非空的字符串,长度不是零。您可以使用不同的测试,但是您定义了&#34; empty&#34;。列中的单个空格也被视为&#34;空&#34;?)