【问题标题】:MySQL WHERE IN condition with IFNULL functionMySQL WHERE IN 条件与 IFNULL 函数
【发布时间】:2018-02-19 17:49:43
【问题描述】:

我在 WHERE IN 条件下使用的 IFNULL 函数有问题:

SELECT provider_id FROM provider WHERE provider_id IN ( IFNULL("131, 132",'999') )

我尝试了所有引用替代方案,例如:

 SELECT provider_id FROM provider WHERE provider_id IN ( IFNULL("'131', '132'", '999') )

但是用 PHP 无法做到这一点。

您能否建议如何正确格式化 IFNULL 函数中的多值参数?

【问题讨论】:

  • 不应该是单引号吗?
  • 你想做什么?获取包含该提供者 ID 或提供者 ID 为空的结果?
  • 您正在使用IFNULL,但其中没有任何参数可以为空。
  • 显示provider_id 列的示例数据此外,在IN 子句中,您应该将每个值分开,而不是像“131, 132”,它将被视为单个值而不是2个值
  • 我正在使用动态过滤器(由变量 $pdo_test 表示)。它可能有值,也可能不取决于用户过滤。 IFNULL 处理 $pdo_test = null (未应用过滤器) 时的情况:"SELECT provider_id FROM provider WHERE provider_id IN (IFNULL($pdo_test, '999'))";

标签: php mysql where ifnull


【解决方案1】:

IFNULL 不采用“多值参数”。无法正确格式化。

IFNULL 函数只接受两个参数。如果第一个参数的计算结果为 NULL,则函数返回第二个参数。否则,它返回第一个表达式。

即SQL表达式

  IFNULL(foo,'bar')

等价于

  CASE WHEN foo IS NULL THEN 'bar' ELSE foo END

这个:

SELECT IFNULL("131, 132",'999')

返回:

IFNULL("131, 132",'999')  
--------------------------
131, 132                  

还有这个:

provider_id IN ( IFNULL("131, 132",'999') )

相当于:

provider_id = '131, 132'

不清楚您要完成什么,或者为什么声明中包含IFNULL 函数。

后退一步,更清楚地表达你要解决的问题。

【讨论】:

  • 感谢您的回答,语句旨在与动态条件过滤一起使用,它可能具有以下值:null、一个值或多个值。所以我的方法是弄乱php代码,而不是首先验证条件是否为空,如果不为空,那么IFNULL应该将条件传递给父函数IN。但后来我的引号不匹配......与 PDO 相同
【解决方案2】:

首先,您的问题是在非空值上使用IFNULL,这是没有意义的。

其次IFNULL 将返回单个值,没有必要为单个值执行provider_id IN (...),因为它与provided_id=... 相同

最后,如果你想检查一个 PHP 变量是否为空,那么让 PHP 处理它。

//$pdo_test
$query = "SELECT provider_id FROM provider";
if ($pdo_test !== null) {    
   $query = " WHERE provider_id=?"
}

然后就可以进行查询了:

$stmt = $pdo->prepare($query);
if ($pdo_test !== null) {  
   $stmt->bindParam(1,$pdo_test,PDO::PARAM_INT); //Looks like an int, but change if its something else
} 
//Code like  $stmt->fetch() and processing goes here

【讨论】:

  • 您好,我展示了值 131 和 132 的示例,仅供参考。值由 VALUE 可能为空的变量携带。我想找到没有 PHP 验证的方法,因为完整的 SQL 语句比我的示例更复杂。
  • @Iman 我坚持我的建议,您应该让 PHP 处理 PHP 变量,因为它们不是数据库处理的责任。不过,我也建议您提供一个更准确地描述用例复杂性的示例,以便获得更明智的答案。
  • 谢谢@apokryfos,似乎是要走的路。谢谢大家。
【解决方案3】:
SELECT provider_id FROM provider WHERE provider_id IN ('131', '132', '999')

只需尝试上面的代码。

您不需要任何额外的引号或其他东西来执行您的查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    相关资源
    最近更新 更多