我们如何过滤依赖于用户选择的参数的查询?

时间:2017-02-15 21:52:34

标签: sql-server filter parameters conditional-statements birt

我正在尝试过滤我的查询取决于用户在期间(月份或年份)中选择的内容 我通过BIRT检索参数。

我的查询是:

SELECT DATE
FROM TABLE
WHERE Year(DATE) = Year(CURRENT_TIMESTAMP) AND Month(DATE) = Month(CURRENT_TIMESTAMP)

我的结果是:

DATE
2017-02-14
2017-02-14
2017-02-14
2017-02-14
2017-02-14
2017-02-14
2017-02-14
2017-02-01
2017-02-02

我要做的是:如果用户选择年份,我将最后一个条件放在评论中,结果应为:

DATE
2017-02-14
2017-02-14
2017-02-14
2017-02-14
2017-02-14
2017-02-14
2017-02-14
2017-01-25
2017-01-26
2017-02-01
2017-02-02
2017-01-20
2017-01-20
2017-01-20
2017-01-20
2017-01-20
2017-01-20
2017-01-20
2017-01-20
2017-01-20

我尝试使用CASE,如:

CASE WHEN USER_PARAM = 'month' then Month(DATE) = Month(CURRENT_TIMESTAMP) END

显然,这不好, 我尝试使用OR / AND,如:

Year(DATE) = Year(CURRENT_TIMESTAMP) 
    OR ('USER_PARAM' = 'MONTH' AND Month(DATE) = Month(CURRENT_TIMESTAMP))

如果'USER_PARAM' = 'MONTH'为真 - >这是行不通的,因为我有这么多年(不是现在的)

Year(DATE) = Year(CURRENT_TIMESTAMP) 
    AND ('USER_PARAM' = 'MONTH' AND Month(DATE) = Month(CURRENT_TIMESTAMP))

如果'USER_PARAM' = 'MONTH'为假 - >这不起作用,因为我没有任何数据

2 个答案:

答案 0 :(得分:1)

你刚刚改变了你的状况 替换' MONTH'按照年龄'并改变' AND'用' OR'你很高兴。

Year(DATE) = Year(CURRENT_TIMESTAMP) 
AND ('USER_PARAM' = 'YEAR' OR Month(DATE) = Month(CURRENT_TIMESTAMP))

答案 1 :(得分:1)

使用可选用户参数的最佳方法是(我相信)允许null为外卡或默认值。

因此,如果您的参数@month可以为null,则以下内容将起作用

WHERE MONTH(DATE) = COALESCE(@month,MONTH(DATE)) 

如果@month为null,则使用此语句,然后一切都匹配,否则过滤

因此,如果您只想要默认的当前月份,可以使用

WHERE MONTH(DATE) = COALESCE(@month,MONTH(CURRENT_TIMESTAMP)) 

最终的where语句如下所示:

WHERE YEAR(DATE) = COALESCE(@year,YEAR(CURRENT_TIMESTAMP)) 
  AND MONTH(DATE) = COALESCE(@month,MONTH(CURRENT_TIMESTAMP))