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 语句的主要内容,如果未能解决你的问题,请参考以下文章

当 php/mysql if 语句为真时播放声音剪辑?

MyBatis-动态sql语句-if用法——MySQL系列学习笔记

MyBatis-动态sql语句-if用法——MySQL系列学习笔记

如何根据 HTML FORM 中定义的变量动态生成 MYSQL UPDATE 语句

php - 如何生成 MySQL INSERT 语句以使用数组中的多行填充表

PHP中的动态密码生成[重复]