我正在尝试执行一些有点复杂的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子句中的逻辑,但是今天早上我无法绕过它。目前,查询未按预期执行。
任何见解都会有所帮助! 感谢
答案 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'
我知道使用动态查询会感觉很脏,但这是一个很好的角落案例,当时真的可以出类拔萃。我现在将为您找到一个信息丰富的链接。 (这需要阅读很多,但非常值得学习)