SQL查询根据参数进行更改

时间:2012-02-08 16:04:15

标签: sql

真正的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'的形式传递。

有没有办法在一个查询中执行此操作?谢谢你的帮助。

4 个答案:

答案 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_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'))

...在索引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'))