2013-07-25 21 views
1

这是一个奇怪的,我似乎无法包裹我的头。MySQL条件/优先条件下

基本上我需要基于具有覆盖的值进行搜索。所以有2列基本上是相同的内容。一个是自动更新的,一个是手动的。如果自动装置不可用,它将使用手册,如果手册不可用,它将使用自动装置。最后,如果两者都可用,它将使用自动除非和“覆盖”标志被启用(可能是第三列)。

我需要做的是基于该参数进行搜索,就好像它是一个字段一样,使用列上的优先级集合。所以这里是一个WHERE语句的例子,但我不知道什么可能是正确的语法使用。

WHERE (isset(width)?(width_override?o_width:width):o_width) = {query} 
+0

你应该为此使用一个存储过程,它将允许你使用变量来存储条件,这会比试图在where子句中做到这一点更容易 – holaSenor

回答

2

使用IF函数。

WHERE IF(width IS NOT NULL, IF(width_override, o_width, width), 
          o_width) = {query} 
+0

这似乎给我带来了错误,它与我对典型的if语句的知识不同,我不知道在哪里查看来诊断它。 –

+0

@Reaction:在第一行结尾处只有一个逗号缺失。 IF()函数的语法很简单:'IF(a,b,c)'。如果a是真的那么返回b否则返回c。 Barmar嵌套了另一个IF表达式来代替'b'。 – spencer7593

+0

我明白了,我会研究一下,谢谢!有了这个编辑,立即工作,并增加了覆盖,完美! –

2

我认为你正在寻找COALESCE():

SELECT COALESCE(overridden_width_col, automatic_width_col) width 
    FROM yourtable 
WHERE COALESCE(overridden_width_col, automatic_width_col) = %param 

COALESCE()将返回第一个非空参数。 overridden_​​width_col设置为NULL,它将使用automatic_width_col。

+0

越权列怎么样? – Barmar

+0

o_width是手动的,宽度是自动的。基本上一个值是由守护进程自动生成的,但为了允许更多的控制,您可以使用o_width来覆盖它,如果需要/ /如果自动的没有设置。最后,width_override是强制它使用手动,无论。 –

+0

@Reaction对不起,从问题中不清楚我已经澄清了我的回答 – artfulrobot