PHP - 为 mysql 生成动态 IF 语句
Posted
技术标签:
【中文标题】PHP - 为 mysql 生成动态 IF 语句【英文标题】:PHP - Generate a dynamic IF statement for mysql 【发布时间】:2011-10-25 20:40:21 【问题描述】:我正在努力解决这个问题。我有一个不确定大小的键/值数组,我想用它来为 mysql 查询生成动态 if 语句。
我的数组看起来像:
$arr = array("a" => "b", "c" => "d", "e" => "f");
考虑到最后的 MySQL 语句看起来像
SELECT
IF(field1 = 'a', 'b',
IF(field1 = 'c', 'd',
IF(field1 = 'e', 'f', default_value))) AS value FROM tbl;
我知道我必须做一个递归数组,但我不确定如何修改数组以使其不会陷入无限循环。我想像这样调用它:
$if_stmt = generate_if($arr, "default_value");
如果没有其他逻辑测试等于 true,则“default_value”是默认值。到目前为止我有
function generate_if(&$arr, $default_value = "default_value")
foreach($arr as $orig => $new)
不知道如何继续.. 非常感谢任何帮助。
【问题讨论】:
查询中的CASE
不起作用吗?
【参考方案1】:
我建议使用 CASE
语句,而不是复杂的 IF/ELSE:
$sql = 'SELECT CASE ';
for($array as $if => $then)
$sql .= sprintf('WHEN field1 = \'%s\' THEN \'%s\' ',
mysqli_real_escape_string($if),
mysqli_real_escape_string($then));
$sql .= sprintf('ELSE \'%s\' END CASE AS value ',
mysql_real_escape_string($default_value));
$sql .= 'FROM table1';
【讨论】:
【参考方案2】:考虑到你的 SQL 是正确的:
function generate_if($arr, $default_value = "default_value")
echo 'SELECT';
foreach($arr as $k => $v)
echo ' IF(field1 = "', $k,'", "', $v,'", ';
echo $default_value,
str_repeat(')', count($arr)),
' AS value FROM tbl;';
我认为您可以避免使用引用。它们不会提高性能。
【讨论】:
【参考方案3】:如果我明白你想要什么:
丑陋的方式:
$ending = '';
$sql = 'SELECT ';
foreach ($arr as $orig => $new)
$sql .= 'IF(field1 = ' . $orig . ', ' . $new . ',';
$ending .= ')';
$sql .= $default_value . $ending . ' AS value FROM tbl';
也许你可以告诉我们更多关于你想做的事情,因为我不确定你的方向是否正确。
【讨论】:
老兄。这完美地完成了这项工作。我想我过于复杂了,这正是我所需要的。 不客气,有更聪明的方法可以做到这一点,请参阅@Dor 的回答,例如str_repeat
技巧,但它确实有效以上是关于PHP - 为 mysql 生成动态 IF 语句的主要内容,如果未能解决你的问题,请参考以下文章
MyBatis-动态sql语句-if用法——MySQL系列学习笔记
MyBatis-动态sql语句-if用法——MySQL系列学习笔记
如何根据 HTML FORM 中定义的变量动态生成 MYSQL UPDATE 语句