如果value不为空,则插入mysql

时间:2015-06-01 18:43:09

标签: mysql

我在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()

2 个答案:

答案 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;?)