我们有x2列min
和max
。每个都可以是null
或integer
。当我们开始搜索投掷表时我们不能使用BETWEEN命令...问题是,如何在这个条件范围内找到
value
大于min
(如果它不为空)和
value
小于max
(如果它不为空)和
value
的范围为min
和max
(如果它们不为空) value
- 我们的整数。如您所见,我们无法使用BETWEEN命令。
答案 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);
或非常基本的AND
和OR
:
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)
根据您的逻辑,如果min
或max
为NULL
,则应忽略该限制。在上面的WHERE
子句中,如果min
为NULL
,则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)
这是我创建的示例小提琴
答案 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)');