【问题标题】:SQL statement using AND depending on the day of the week根据星期几使用 AND 的 SQL 语句
【发布时间】:2016-04-24 23:55:13
【问题描述】:

我目前有 2 个不同的 sql 脚本需要根据星期几运行。我正在尝试找到一种方法将它们组合成一个,并有逻辑检查它是星期几,并据此运行适当的更改。

所以基本结构是:

SELECT * FROM table
WHERE foo = 'bar'
AND foo2 = 'bar2'
AND foo3 = 'bar3';

唯一的区别是如果是星期一,其中一个 AND 案例需要更改。

所以我需要的伪代码看起来像:

SELECT * FROM table
WHERE foo = 'bar'
AND foo2 = 'bar2'

if day = 'Monday' then 
AND foo3 = 'bar3'
else 
AND foo3 = 'bar3a';

有什么想法吗?我试图合并一个基于this 的案例选择,但对我来说没有成功。

谢谢!

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    我认为正确的逻辑是:

    WHERE foo = 'bar' AND
          foo2 = 'bar2'
          ( (TO_CHAR(SYSDATE, 'Dy') = 'Mon' AND foo3 = 'bar3') ) OR
            (TO_CHAR(SYSDATE, 'Dy') <> 'Mon' AND foo3 = 'bar3a')
          )
    

    两个重要的考虑因素:

    • 这会检查星期一和非星期一。
    • 这使用日期缩写而不是全名。 Oracle 填充日期名称,因此结果不是'Monday',而是'Monday ',并且空格会有所不同。
    • 正如 Thorstein 所提到的,您可以添加第三个参数 'NLS_DATE_LANGUAGE=AMERICAN',因此结果为英文。

    【讨论】:

    • 谢谢!它似乎工作得很好!另外谢谢,我完全忘记了在 Oracle 中的日子。
    • 好答案。但是,在使用名称时应明确指定语言,以免依赖匹配的会话设置:TO_CHAR(SYSDATE, 'Dy', 'NLS_DATE_LANGUAGE=AMERICAN')
    【解决方案2】:

    case 表达式返回一个值。不能像where子句中的问题中提到的那样使用。

    使用andor 表达您的条件。

    SELECT * FROM table
    WHERE foo = 'bar'
    AND foo2 = 'bar2'
    AND (
         (TO_CHAR(SYSDATE, 'Day') = 'Monday' AND foo3 = 'bar3') OR foo3 = 'bar3a'
        )
    

    【讨论】:

    • 感谢 vkp 的快速响应。我在演示员工表上使用此代码尝试了一些示例,由于某种原因,无论我设置的星期几,它总是选择 OR 侧。所以:SELECT * FROM emp WHERE JOB = 'MANAGER' AND ((TO_CHAR(SYSDATE, 'Day') = 'Sunday' AND COMM = 3) OR COMM = 7); 将始终返回佣金 = 7 的经理
    猜你喜欢
    • 2021-07-21
    • 2016-10-22
    • 2020-04-12
    • 2015-06-20
    • 2013-01-09
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多