Mysql和\之间的条件

时间:2016-04-08 14:28:07

标签: mysql conditional-statements between

我们有x2列minmax。每个都可以是nullinteger。当我们开始搜索投掷表时我们不能使用BETWEEN命令...问题是,如何在这个条件范围内找到

  1. value大于min(如果它不为空)
    1. value小于max(如果它不为空)
      1. value的范围为minmax(如果它们不为空)
      2. value - 我们的整数。如您所见,我们无法使用BETWEEN命令。

4 个答案:

答案 0 :(得分:1)

所以NULL意味着没有限制。您仍然可以使用BETWEEN

select *
from mytable
where @value between coalesce(minvalue, @value) and coalesce(maxvalue, @value);

或只是AND

select *
from mytable
where @value >= coalesce(minvalue, @value) 
  and @value <= coalesce(maxvalue, @value);

或非常基本的ANDOR

select *
from mytable
where (@value >= minvalue or minvalue is null)
  and (@value <= maxvalue or maxvalue is null);

答案 1 :(得分:0)

使用此:

WHERE col BETWEEN COALESCE(min, -2147483648) AND COALESCE(max, 2147483647)

根据您的逻辑,如果minmaxNULL,则应忽略该限制。在上面的WHERE子句中,如果minNULL,则col将始终大于下边界,假设col是整数。类似的逻辑适用于max条件。

您看到的大(和小)数字代表MySQL中整数的最大和最小可能值。

答案 2 :(得分:0)

如果没有使用BETWEEN的选项,我建议您使用简单的WHERE-AND子句。

如果不允许空值,则应使用COALESCE函数

http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_coalesce

  

返回列表中的第一个非NULL值,如果没有非NULL值,则返回NULL。

SELECT * 
FROM SCORES
WHERE score >= COALESCE(min_score, score)
AND score <= COALESCE(max_score, score)

这是我创建的示例小提琴

http://sqlfiddle.com/#!9/306947/2/0

答案 3 :(得分:0)

我的解决方案Yii2 AR喜欢

    $query
        ->joinWith(['vacancySalary'])
        ->andWhere([
            'and',
            'IF (vacancy_salary.min IS NULL, ' . $this->salaryMin . ', vacancy_salary.min) >= ' . $this->salaryMin,
            'IF (vacancy_salary.max IS NULL, ' . $this->salaryMin . ', vacancy_salary.max) <= ' . $this->salaryMin
        ]);

简单回答是使用IF条件和适当的值。

增加: 另一种方式

$query
    ->joinWith(['vacancySalary'])
    ->andWhere($this->salaryMin . ' BETWEEN IF(vacancy_salary.min IS NULL, 0, vacancy_salary.min) AND IF(vacancy_salary.max IS NULL, 0, vacancy_salary.max)');