如何在mysql where子句中使用if else

时间:2015-12-15 04:14:53

标签: mysql sql codeigniter

我想在mysql中查询数据,如:

$cid=$_POST["cid"];
$room_id=$_POST["room_id"];
$time=$_POST["time"];

$reuslt=$this->db-query("SELECT * FROM mytable WHERE if($cid is not null){then check cid=$cid} else{don't check} AND if($room_id is not null){then check room_id=$room_id} else{don't check} AND if($time is not null){then check time=$time} else{don't check}");

如何编写正确的sql来查询数据?

5 个答案:

答案 0 :(得分:1)

因此,如果您想使用SQL if | else语句,请查看Using an IF Statement in a MySQL SELECT queryIf else on WHERE clause之类的内容。

其他一些sql答案看起来也很有趣。但是我会警告不要过度复杂。

对于这个OP,它更容易准备发送给DB的语句,而不是过度思考它,并且如果大量数据集和不良索引,风险性能会下降。

所以,如果这与php if | else更相关,并且你想将它保持为单行(而不是在多个语句上连接一个字符串),我会推荐三元语法

https://davidwalsh.name/php-shorthand-if-else-ternary-operators

例如,这样的事情应该有效:

$reuslt= $this->db-query("SELECT * FROM mytable WHERE TRUE " 
   . ( ($cid is not null) ? " AND cid='".$cid."'" : "" ) 
   . ( ($room_id != null) ? " AND room_id='".$room_id."'" : "" ) 
   . ( ($time != null) ? " AND  time='" . $time . "'" : "" );

WHERE TRUE只是为了更容易打印,尽管创建$ sql字符串变量并在单独的if()语句上准备语句真的会更容易。

虽然我也强调需要转义这些值,就像你应该对所有用户输入一样。

http://php.net/manual/en/mysqli.real-escape-string.php

答案 1 :(得分:1)

您可以在1=1子句中的IF函数中使用WHERE作为占位符:

$query = "SELECT * FROM mytable
    WHERE IF('$cid' != '', cid='$cid', 1=1)
    AND IF('$room_id' != '', room_id='$room_id', 1=1)
    AND IF('$time' != '', time='$time', 1=1)"
$result=$this->db->query($query);

我不知道你的框架是如何处理它的,但是这段代码很容易受到SQL注入的攻击,你应该使用带参数化的准备好的查询。

答案 2 :(得分:0)

下面的SQL语句将执行您要执行的操作:

SELECT * FROM mytable WHERE (('$cid' is not null) AND (cid='$cid')) 
                      AND (('$room_id' is not null)AND(room_id='$room_id'))
                      AND (('$time' is not null) AND (time='$time'))

答案 3 :(得分:0)

您可以通过case声明:

执行此操作
SELECT * 
FROM mytable 
WHERE 
    (cid = case when $cid is not null then $cid else cid end) AND 
    (room_id = case when $room_id is not null then $room_id else room_id end) AND 
    (time = case when $time is not null then $time else time end)

答案 4 :(得分:0)

这就是我在我的案例及其工作中的表现。()在模型中

public function get($table,$column='*',$where='',$start='',$limit='',$seach_field='', $seach_keyword='', $seach_type='',$orderby='',$order_type='DESC')
    {
        $this->db->select($column); 
        $this->db->from($table);
        if($where !='')
        {
            $this->db->where($where);   
        }
        if($seach_field !='' && $seach_keyword !='' && $seach_type!='')
        {
            $this -> db -> like($seach_field, $seach_keyword, $seach_type);
        }
        if($orderby!='')
        {
            $this->db->order_by($orderby,$order_type);
        }
        if($limit!='')
        {
            $this->db->limit($limit, $start);
        }
        $que = $this->db->get();

        return $que->result_array();        
    }