2012-02-08 153 views
1

一个真正的IF ... THEN语句在这里会很有用,我传递2个参数(cfk_in和senr_in)到我查询的用户,并根据帕拉姆是Y或N,我会改变我的查询,这里是我当前的查询:基于参数的SQL查询更改

select a.course_id, a.topic_code 
from course_sections a, 
statuses b 
where a.course_id = b.course_id 
    and term = upper('2010FALL') 
    and status = 'P' and pos = 1 

因此,这是非常简单,并会给我所有部分和特定术语的主题代码。如果用户将两个参数都传递为'N',我想只保留它在上面的查询。如果用户通过cfk_in ='Y'和senr_in ='N',那么我想添加“和a.topic_code ='CFK%'”,并且如果用户通过cfk_in ='N'和senr_in = 'Y',我想添加“和a.topic_code ='SENR'”。我不允许他们通过'Y'。

有没有办法在一个查询中做到这一点?谢谢您的帮助。

+0

这是一个存储过程中? – darasd 2012-02-08 16:09:01

回答

2

这很简单:

[your query...] 
and ((cfk_in = 'N' and senr_in = 'N') or 
    (cfk_in = 'Y' and senr_in = 'N' and a.topic_code like 'CFK%') or 
    (cfk_in = 'N' and senr_in = 'Y' and a.topic_code = 'SENR')) 

这也将禁止通过这两个参数'Y',因为这将不返回任何结果。如果cfk_insenr_in没有在表中的实际字段,然后将其标记为绑定变量:

[your query...] 
and ((:cfk_in = 'N' and :senr_in = 'N') or 
    (:cfk_in = 'Y' and :senr_in = 'N' and a.topic_code like 'CFK%') or 
    (:cfk_in = 'N' and :senr_in = 'Y' and a.topic_code = 'SENR')) 

或者与Java:

[your query...] 
and ((? = 'N' and ? = 'N') or 
    (? = 'Y' and ? = 'N' and a.topic_code like 'CFK%') or 
    (? = 'N' and ? = 'Y' and a.topic_code = 'SENR')) 

...在指标1,3,5结合cfk_insenr_in在索引2,4,6

NB:我觉得你的意思是过滤a.topic_code like 'CFK%',不a.topic_code = 'CFK%'

1

有没有办法在一个查询中做到这一点?

绝对。您可以使用OR来“屏蔽”查询的某些部分。例如,

AND (senr_in <> 'N' OR a.topic_code = 'CFK%') 

会注意topic_code只有当senr_in = 'N'。否则,整个子表达式将评估为true,有效地将其自身排除在查询条件之外。

+0

虽然这个聪明的解决方案不那么冗长,但我倾向于认为这些布尔表达式是高度不可读的,并且在需要时难以正确更改...... – 2012-02-08 16:16:47

+0

@LukasEder这完全取决于表达式的结构。在适当地格式化和评论时,它不应该引起任何问题:毕竟,这个相对广为人知的带有“掩蔽”布尔表达式的“习语”适用于SQL查询语言的内部和外部,因此它通常只是即刻熟悉。 – dasblinkenlight 2012-02-08 16:24:05

+0

其实,你的表达不正确,因为如果'cfk_in ='N'和senr_in ='N'',则不应该应用额外的过滤器。我同意“比较有名的成语”。我仍然觉得比使用规范表达式更难修改。但我想这是一个味道问题... – 2012-02-08 16:43:13

0

当然,有一种方法。你可以使用你的参数在这里的条件,像这样:

select a.course_id, a.topic_code 
from course_sections a, 
statuses b 
where a.course_id = b.course_id 
    and term = upper('2010FALL') 
    and status = 'P' and pos = 1 
    and ((cfk_in = 'Y' and senr_in = 'N' and a.topic_code like 'CFK%') or  
     (cfk_in = 'N' and senr_in = 'Y' and a.topic_code = 'SENR') or 
     (cfk_in = 'N' and senr_in = 'N')) 
0

是的,你可以在一个查询做到这一点。 SimPy中添加以下到您的where子句:
(注意,我改变了你的a.topic_code = 'CFK%' 来a.topic_code LIKE '%CFK')

AND (@cfk_in = 'N' OR (@cfk_in = 'Y' AND a.topic_code LIKE 'CFK%')) 
AND (@senr_in = 'N' OR (@senr_in = 'Y' AND a.topic_code = 'SENR'))