【问题标题】:Oracle order NULL LAST by defaultOracle order NULL LAST 默认
【发布时间】:2013-09-12 22:43:14
【问题描述】:

有没有办法将 Oracle 使用的 default 顺序设置为 NULL LAST(或 NULL FIRST),而不必放置它在每个查询中?

【问题讨论】:

    标签: database oracle sorting


    【解决方案1】:

    不行,没办法改the default behavior of NULLS FIRST and NULLS LAST

    NULLS LAST 是升序的默认值,NULLS FIRST 是 默认为降序。


    我无法证明它是不可能改变的,但我在最有可能实现的地方找不到这样的功能。

    SQL 选项manual 没有提及任何内容。

    参数V$PARAMETER中的nls参数都没有控制它:select * from v$parameter where name like '%nls%';

    隐藏参数没有hidden parameter。我试着搜索任何东西 像 %null% 或 %sort%,它们都不相关。

    Locale Builder Oracle 允许您create your own custom sorting。它 有很多选项,但没有一个允许您定义 NULL 的排序方式。将主要排序和次要排序数字设置得非常高或低并不 更改它(我希望将 NULL 实现为硬编码的小值或大值)。您可以为 0x0000 设置排序顺序,即“NULL”,但这是另一种类型的 NULL。

    【讨论】:

      【解决方案2】:

      不,如果不使用order by 子句,就无法启用默认排序,它允许您将NULLs 放在最后或最前面。这是一个例子:

      1. 升序

        SQL> with t1(col) as(
          2    select 1    from dual union all
          3    select 2    from dual union all
          4    select null from dual union all
          5    select 3    from dual
          6  )
          7  select *
          8    from t1
          9  order by col asc nulls last
          10  ;
        

        结果:

          COL
          ------
           1
           2
           3
           null
        
      2. 降序

          SQL> with t1(col) as(
           2    select 1    from dual union all
           3    select 2    from dual union all
           4    select null from dual union all
           5    select 3    from dual
           6  )
           7  select *
           8    from t1
           9  order by col desc nulls last
          10  ;
        

        结果:

          COL
          ----------
           3
           2
           1
           null
        

      【讨论】:

        【解决方案3】:

        ORDER BY EMPLOYER_NAME DESC NULLS LAST

        以上在 Oracle 11g 上对我有用

        【讨论】:

          【解决方案4】:

          按升序,NULL 值总是排在最后

          【讨论】:

          • 并按降序排列?
          • 如果未指定 null 排序,则 null 值的处理为: - 如果排序为 ASC,则为 NULLS LAST - 如果排序为 DESC,则为 NULLS FIRST - 如果未指定升序或降序,并且也未指定空排序,则使用两个默认值,因此顺序将使用 NULLS LAST 升序。
          【解决方案5】:

          null 放在末尾但仍 按 asc 排序

          SELECT * FROM users ORDER BY -created_at desc;
          

          Answer Source

          【讨论】:

            【解决方案6】:

            COALESCE 函数

            我很惊讶没有人提到它,但您可以使用 COALESCE 函数从参数中取出第一个非空值。在大多数 DBMS 中可用:

            SELECT [Name], [Email] FROM Users
            ORDER BY COALESCE([Name], 'zzz')
            

            这基本上是如何工作的:如果 [Name] 是 null,该函数将返回 'zzz' 将记录向下推。它在大多数情况下都可以解决问题。文档here

            【讨论】:

            • 感谢您的回复,但您仍然必须将其放入每个查询中。这比ORDER BY Name NULLS LAST好吗?
            猜你喜欢
            • 2019-01-03
            • 1970-01-01
            • 2016-12-25
            • 1970-01-01
            • 2011-04-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-18
            相关资源
            最近更新 更多