真正的IF ...... THEN声明在这里很有用,但我不知道。我让用户将2个参数(cfk_in和senr_in)传入我的查询,并根据参数是Y还是N,我将更改我的查询,这是我当前的查询:
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 :(得分: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_in
和senr_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'))
...在索引2,4,6处的索引1,3,5和cfk_in
处绑定senr_in
N.B:我认为您打算过滤a.topic_code like 'CFK%'
,而不是a.topic_code = 'CFK%'
答案 1 :(得分:1)
有没有办法在一个查询中执行此操作?
绝对。您可以使用OR
“屏蔽”查询的某些部分。例如,
AND (senr_in <> 'N' OR a.topic_code = 'CFK%')
仅在topic_code
时才会注意senr_in = 'N'
。否则,整个子表达式将评估为true
,从而有效地将自己排除在查询条件之外。
答案 2 :(得分:0)
当然,有办法。您可以在where条件中使用参数,如下所示:
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'))
答案 3 :(得分: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'))