我们如何过滤取决于用户选择的参数的查询?
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))
我正在尝试根据用户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))