【问题标题】:Sorting by day of week - decode returns null按星期几排序 - 解码返回 null
【发布时间】:2016-03-12 17:47:44
【问题描述】:

我需要从 EMPLOYEES 表中获取一些数据,并根据 hire_date 创建带有星期名称的新列。然后必须按星期几(从星期一到星期日)对结果进行排序,这就是我的问题所在。

我决定使用解码功能,但似乎我做错了什么。

这是我的查询

SELECT FIRST_NAME, LAST_NAME, HIRE_DATE, TO_CHAR(HIRE_DATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH') AS DAY_OF_WEEK FROM EMPLOYEES ORDER BY DECODE(DAY_OF_WEEK,'MONDAY',1,'TUESDAY',2,'WEDNESDAY',3,'THURSDAY',4,'FRIDAY',5,'SATURDAY',6,'SUNDAY',7)

一切正常,除了排序。周三开始,其余时间随机。

我稍微改变了查询,所以我可以看到这个函数是如何工作的。

SELECT FIRST_NAME, LAST_NAME, HIRE_DATE, TO_CHAR(HIRE_DATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH') AS DAY_OF_WEEK, DECODE(TO_CHAR(HIRE_DATE, 'D', 'NLS_DATE_LANGUAGE=ENGLISH'), 'MONDAY',1, 'TUESDAY',2,  'WEDNESDAY',3,  'THURSDAY',4,  'FRIDAY',5,  'SATURDAY',6,  'SUNDAY',7) AS DAY2 FROM EMPLOYEES ORDER BY DECODE(DAY_OF_WEEK, 'MONDAY',1, 'TUESDAY',2,  'WEDNESDAY',3,  'THURSDAY',4,  'FRIDAY',5,  'SATURDAY',6,  'SUNDAY',7)

在 DAY2 列中返回类似这样的内容,周三为 3 号,其他所有内容为 (null)。

这就解释了为什么排序不起作用,但我仍然不知道为什么它不起作用以及查询中的错误在哪里:)

【问题讨论】:

    标签: sql sorting oracle11g


    【解决方案1】:

    问题是这一天用空格填充。 “星期三”匹配,因为它是最长的工作日名称。如果你这样做,你会看到这个:

    SELECT '|' || TO_CHAR(HIRE_DATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH') || '|'
    FROM EMPLOYEES ;
    

    如果您可以接受星期几的缩写:

    SELECT FIRST_NAME, LAST_NAME, HIRE_DATE,
           TO_CHAR(HIRE_DATE, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') AS DAY_OF_WEEK
    FROM EMPLOYEES
    ORDER BY DECODE(DAY_OF_WEEK, 'MON', 1, 'TUE', 2, 'WED', 3, 'THU', 4, 'FRI', 5, 'SAT', 6, 'SUN', 7);
    

    我更喜欢 ANSI 标准 CASE 而不是 DECODE(),但两者都适用于这种情况。

    【讨论】:

    • 你是对的!我没有意识到名字后面有一些空格。至于缩写我觉得够用了,所以我可以用它们来代替全名:) 非常感谢!
    • 我总是想知道为什么...填充空间解释了它。
    【解决方案2】:

    这使得逻辑有点难以理解,但满足需要。

    https://docs.oracle.com/cloud/latest/db112/SQLRF/functions255.htm#SQLRF52058..

    'IW' 与 ISO 周的第一天同一天,即星期一

    with EMPLOYEES as (
    SELECT 'Paul1' First_Name, 'Revere' Last_name, To_date('1-MAR-2016') Hire_Date FROM DUAL UNION ALL
    SELECT 'Paul2', 'Revere', to_date('2-MAR-2016') FROM DUAL UNION ALL
    SELECT 'Paul3', 'Revere', to_date('3-MAR-2016') FROM DUAL UNION ALL
    SELECT 'Paul4', 'Revere', to_date('4-MAR-2016') FROM DUAL UNION ALL
    SELECT 'Paul5', 'Revere', to_date('5-MAR-2016') FROM DUAL UNION ALL
    SELECT 'Paul6', 'Revere', to_date('6-MAR-2016') FROM DUAL UNION ALL
    SELECT 'Paul7', 'Revere', to_date('7-MAR-2016') FROM DUAL)
    
    SELECT FIRST_NAME, LAST_NAME, HIRE_DATE
    , TO_CHAR(HIRE_DATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH') AS DAY_OF_WEEK
    FROM EMPLOYEES 
    order by TRUNC (Hire_Date) - TRUNC (Hire_Date, 'IW')
    

    【讨论】:

    • 由于您不返回日期编号,因此不需要1 + :-)
    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多