CodeIgniter - SQL 语句 IF 那么 WHERE?
Posted
技术标签:
【中文标题】CodeIgniter - SQL 语句 IF 那么 WHERE?【英文标题】:CodeIgniter - SQL sentence IF then WHERE? 【发布时间】:2021-10-30 14:13:59 【问题描述】:目前我能够在 CodeIgniter 中执行 WHERE 语句如下:
$builder = $db->table('mytable');
$builder->select(*);
$builder->where('age >='.$params['some-param']);
我需要做的是一个仅在 IF 语句为真时才适用的 WHERE 语句。比如:
(IF gender = 'Male', apply these rows the following where) $builder->where('age >='.$params['some-param']);
(IF gender = 'Female', apply these other rows, this where and not the first one) $builder->where('age >='.$params['some-other-param']);
还要注意 ['some-param'] 和 ['some-other-param'] 不会一直存在。我知道它可以用 OR 语句来实现,但如果 ['some-other-param'] 未设置,那么查询将类似于:
$builder->where("age >=".$params['some-param']." AND gender = 'Male'");
这不会包括任何性别 = 'Female' 的行,我也需要它。
我不知道如何实现这一点。任何方向都将不胜感激。
【问题讨论】:
【参考方案1】:这样的东西不可行吗?
-- Both age filters are set
select *
from my_table
where (
(gender = 'Male' and age >= 20)
or
(gender = 'Female' and age >= 30)
)
-- Only Male filter is set
select *
from my_table
where (
(gender = 'Male' and age >= 20)
or
gender = 'Female'
)
-- Only Female filter is set
select *
from my_table
where (
(gender = 'Female' and age >= 20)
or
gender = 'Male'
)
【讨论】:
它可以工作,但这些过滤器并不总是存在。因此,如果没有“女性”年龄过滤器,那么它将类似于 $builder->where(gender = 'Male' and age >= 20 )。这不包括任何女性。我需要的是同时获得男性和女性,但只有在用户设置它们时才包含这些过滤器。 那您不能只使用if .. then .. else ..
语句来检查是否设置了参数并在此基础上创建查询吗?这应该是可能的,不是吗?我认为这里有类似的东西:***.com/questions/25462064/…
这就是我目前正在做的事情。我的意思是,我需要过滤所有数据。但是,如果您设置了女性年龄或男性年龄的可选参数,则查询应仅按输入年龄或年龄过滤女性、男性或两者(视情况而定)。但是,例如,如果用户仅输入男性年龄,那么正常的 where 查询将是 where(" gender = 'Male' AND age >= ."$param['male-age-filter']),这不只是选择男性行?在这种情况下,我只需要过滤男性,但也包括女性。
因此,如果两者都设置了参数,那么WHERE
子句将类似于我上面的示例。如果只设置了男性年龄过滤器,那么它将是WHERE (gender = 'Male' and age >= 20) OR gender = 'Female'
。如果只设置了女性过滤器,那么它将是WHERE (gender = 'Female' and age >= 20) OR gender = 'Male'
听起来像。我会试试的。以上是关于CodeIgniter - SQL 语句 IF 那么 WHERE?的主要内容,如果未能解决你的问题,请参考以下文章