PHP - 为mysql生成动态IF语句

时间:2011-08-12 14:11:16

标签: php mysql select if-statement recursive-query

我正在努力解决这个问题。我有一个不确定大小的键/值数组,我想用它来为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){

        }
    }

并且不知道如何继续..任何帮助非常感谢。

3 个答案:

答案 0 :(得分:1)

如果我理解你想要的东西:

丑陋的方式:

$ending = '';
$sql = 'SELECT ';
foreach ($arr as $orig => $new) {
    $sql    .= 'IF(field1 = ' . $orig . ', ' . $new . ',';
    $ending .= ')';
}

$sql .= $default_value . $ending . ' AS value FROM tbl';

也许你可以告诉我们更多关于你想做什么的事情,因为我不确定你是否正朝着正确的方向前进。

答案 1 :(得分:1)

考虑到你的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;';
}

我认为你可以避免使用引用。它们不会加快性能。

答案 2 :(得分:0)

我建议使用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';