【问题标题】:PHP - Generate a dynamic IF statement for mysqlPHP - 为 mysql 生成动态 IF 语句
【发布时间】: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 不起作用吗?

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


【解决方案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 技巧,但它确实有效
      猜你喜欢
      • 2019-08-20
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      • 2023-04-07
      • 2014-08-21
      • 2011-01-03
      • 2015-03-13
      • 2013-04-30
      相关资源
      最近更新 更多