复杂的MySQL查询问题

时间:2011-10-13 14:18:53

标签: mysql sql

我正在尝试执行一些有点复杂的mySQL查询。我有两个参数:facility和isEnabled。工厂可以具有“全部”值或特定ID。 isEnabled的值可以是“ALL”或者是0/1。

我的问题是我需要提出可以处理以下场景的逻辑:         1)Facility = ALL AND isEnabled = ALL         2)Facility = ALL AND isEnabled = value         3)Facility = someID AND isEnabled = ALL         4)Facility = someID AND isEnabled = value

问题是我有几个嵌套的IF语句:

IF (Facility = 'ALL') THEN
  IF (isEnabled = 'ALL') THEN
    SELECT * FROM myTable
  ELSE
    SELECT * FROM myTable
    WHERE isEnabled = value
  END IF;
ELSE
  IF (isEnabled = 'ALL') THEN
    SELECT * FROM myTable
    WHERE facility = someID
  ELSE
    SELECT * FROM myTable
    WHERE facility = someID AND isEnabled = value
  END IF;
END IF;

我希望能够使用CASE语句或条件(AND / OR)组合WHERE子句中的逻辑,但是今天早上我无法绕过它。目前,查询未按预期执行。

任何见解都会有所帮助! 感谢

1 个答案:

答案 0 :(得分:2)

你可以这样做......

SELECT
  *
FROM
  myTable
WHERE
  1=1
  AND (facility  = someID OR Facility  = 'ALL')
  AND (isEnabled = value  OR isEnabled = 'ALL')

然而,这会产生一个糟糕的执行计划 - 它试图找到一个尺寸适合所有,但每个参数组合可以根据数据,索引等具有不同的计划。

这意味着最好动态构建查询

SELECT
  *
FROM
  myTable
WHERE
  1=1
  AND facility  = someID  -- Only include this line if : Facility  = 'ALL'
  AND isEnabled = value   -- Only include this line if : isEnabled = 'ALL'

我知道使用动态查询会感觉很脏,但这是一个很好的角落案例,当时真的可以出类拔萃。我现在将为您找到一个信息丰富的链接。 (这需要阅读很多,但非常值得学习)

链接:Dynamic Search