在以下查询中输入为零的Null

时间:2018-08-01 11:25:21

标签: mysql sql case

  1. 在下面的查询中,我将多个select2选项的数组保存到数据库中。
  2. 这里我有一个数据库表参与者,其中包含event_id(int,not null),user_id(int,null),p_mail(varchar,null)。
  3. 当我传递用户中的正确ID时,数据将被正确保存,并且p_email列中将显示null。
  4. 但是当我通过数组传递一些varchar值时,user_id被保存为0,应该为NULL,而Null存储在p_email中,该存储值。

    foreach($resources as $r) {
        global $response;
        $sql = "INSERT INTO participants(event_id, user_id, p_email)
                    SELECT $response,
                           CASE 
                             WHEN EXISTS (SELECT * from users where id = '$r') THEN 
                                '$r'
                             ELSE NULL
                           END,
                           CASE 
                             WHEN  EXISTS (SELECT * from users where id = '$r') THEN 
                               NULL
                             ELSE '$r'
                           END
                    FROM users  WHERE id = 1;";
        $query_result = $conn->query($sql) or die("Failed".$sql);
    
  5. 这是预期传递给int的位置,如果id存在,则应将其存储在user_id列中;否则,如果将其varchar应当存储在p_email中。 enter image description here

  6. 如果我在检查后存储了不在用户中的varchar,而不是将其存储在p_email中,则显示。它在p_email中存储null,在user_id中存储0。

2 个答案:

答案 0 :(得分:0)

我认为这里的问题是id列是数字列。在第一个测试中,您大概传递了一些合法的数字字符串id,例如'123'。 MySQL在内部'123'和字符串123之间进行转换没有问题。但是,在第二次测试中,您通过了类似abc的操作。在这种情况下,MySQL似乎正在将其转换为数值0。另外,假设确实存在id零,那么您的电子邮件列中也会看到NULL

因此,我认为此处的更正是假设id列确实是数字,而只是将数字绑定到插入查询。

而且,您应该阅读有关在MySQL中使用准备好的语句的信息。

答案 1 :(得分:0)

我通过在代码中使用LIKE而不是'='清除了此问题。