【问题标题】:Change the ordering of NULL values in all table columns postgresql call更改所有表列 postgresql 调用中 NULL 值的顺序
【发布时间】:2018-07-30 12:10:36
【问题描述】:

我正在使用带有 postgresql 的 rails 来填充数据表,并且想知道是否有一种方法可以将 NULLS 的默认行为更改为较高的值(在排序时出现较大的数字),使其等于在排序中低于 0 .据我了解,这是一个内置的 postgresql 行为,所以我想我将不得不使用 sql 调用来实现这一点。我需要将此应用于所有列,以便它与 DataTables 排序 ASC/DESC 功能一起使用。

一些类似的功能示例:

  def get_raw_records
     Analytics::Database.where(id: 7).order('give nulls < 0 value here for all columns?')
  end 

NULLS FIRST/LAST 没有提供此功能

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案1】:

    你可以使用

    order by coalesce(col_name,-1)
    

    【讨论】:

    • 这会将 NULLS 放在第一行,即使列上的 ASC/DESC 发生更改,我希望在排序时更改顺序,以便它们始终小于 0
    • @VaoTsun。从问题中可以看出,其意图只是将 null 视为低于 0。
    • 是的,但是 OP 要求所有列,所以它甚至可能不是整数?..
    【解决方案2】:

    建议靠近萨巴里:

    db=# with c(v) as (values('1'),('a'),(null),(null),('b'))
    select * from c
    order by coalesce(v,'-infinity') asc;
     v
    ---
    
    
     1
     a
     b
    (5 rows)
    
    db=# with c(v) as (values('1'),('a'),(null),(null),('b'))
    select * from c
    order by coalesce(v,'-infinity') desc;
     v
    ---
     b
     a
     1
    
    
    (5 rows)
    

    我在这里使用-inf 而不是低于零的固定整数。这适用于text(不是因为text 理解infinity,而是因为-[a-z][0-9] 之前),但不适用于普通integer。当然可以投到float:

    db=# with c(v) as (values(1::float),(3),(null),(null),(-9))
    select * from c
    order by coalesce(v,'-infinity') desc;
     v
    ----
      3
      1
     -9
    
    
    (5 rows)
    
    db=# with c(v) as (values(1::float),(3),(null),(null),(-9))
    select * from c
    order by coalesce(v,'-infinity') asc;
     v
    ----
    
    
     -9
      1
      3
    (5 rows)
    

    with 本身很危险(好吧,不是排序)(而且丑陋)。这导致了答案 - 我没有从我的脑海中看到好的解决方案......你应该更好地为不同的数据类型设置单独的边界。

    【讨论】:

    • 很好,我看到了您在这里所做的事情,现在正在寻找语法以使其适用于与上述函数类似的所有列。现在我有.order("COALESCE(column, -1)") 可以返回正确排序的特定列(尽管不幸的是它破坏了数据表 ASC/DESC 功能:( ...)
    【解决方案3】:

    在 Postgres 中,您可以在 order by 子句中指定您希望 NULL 如何排序:

    select 1 as col UNION select 2 UNION SELECT NULL ORDER BY col ASC NULLS FIRST;
    

    您可以指定 NULLS FIRST 或 NULLS LAST

    https://www.postgresql.org/docs/current/static/queries-order.html

    【讨论】:

      猜你喜欢
      • 2019-04-09
      • 1970-01-01
      • 2015-10-04
      • 2021-02-15
      • 2017-12-26
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多