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

How can we filter a query that depends on a parameter that the user chooses?

我正在尝试根据用户select在期间(月或年)编辑的内容来过滤我的查询 我通过 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

我想做的是:如果用户 select 年,我把最后一个条件放在评论中,结果应该是:

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 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' 为假-> 这不起作用,因为我没有任何数据

你刚刚扭转了你的状态。
将 'MONTH' 替换为 'YEAR' 并将 'AND' 更改为 'OR' 就可以了。

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

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

所以如果你有一个可以为 null 的参数@month,那么下面的方法就可以了

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

使用此语句,如果@month 为空,则所有内容都匹配,否则它会过滤

所以如果你只想要默认的当前月份,你可以使用

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))