【问题标题】:Postgresql - make the order by correctPostgresql - 通过正确的顺序
【发布时间】:2014-08-27 07:41:12
【问题描述】:

感觉是个愚蠢的问题。

我有以下问题

select 'Cardiac - ACS' as a
union 
select 'Cardiac - All' as a
order by a

我希望通过替换“连字符”字符来首先显示第二行“Cardiac - All”。我应该用什么代替它? (以及如何在 Postgres 中找出符号的顺序及其优先级?)

【问题讨论】:

  • 为什么要替换连字符?只要得到ORDER BY 对。
  • .. 就必须这样...
  • 例如你可以做“选择'Cardiac 1 All',这使它首先出现......但这看起来很丑......我想要另一个可以在“-”之前出现的符号......
  • 所以您正在寻找在连字符之前排序的字符?排序顺序由排序规则决定,并取决于您的设置(SHOW lc_collate 查找)。
  • @ericbae select 'Cardiac __ ACS' as a union select 'Cardiac _ All' as a order by a 呢??

标签: sql postgresql sql-order-by


【解决方案1】:

字符排序

排序顺序取决于您的语言环境,尤其是collation。通过以下方式查找您的设置:

SHOW lc_collate;

C 语言环境中,字符根据其字节值排序。这些字符在连字符 ('-') 之前排序:

SELECT chr(g)
FROM generate_series (33,ascii('-')) g

chr
---
!
"
#
$
%
&
'
(
)
*
+
,
-

对于其他排序规则不是也是如此。测试:

SELECT g, chr(g)
FROM   generate_series (33,ascii('-')) g
order  by chr(g) COLLATE "C"

连字符的十进制 ASCII 值为 45。
删除COLLATE "C" 以查看您的当前语言环境的效果。

要在排序规则中查找基本候选字符,请运行:

SELECT g, chr(g)
FROM   generate_series (1,255) g
ORDER  BY chr(g);

【讨论】:

  • 感谢您的帮助。非常感谢。我做了“SHOW lc_collat​​e”,得到了“en_US.UTF-8”,我做了上面的查询,连字符在上面!!!看起来我没有其他符号可以替换它!
  • @ericbae:你也尝试了最后一个查询吗?此外,请考虑对数据进行排序的其他方法。混淆价值观似乎是个坏主意(取决于你实际做什么)。考虑@Clodoaldo's advice
【解决方案2】:

如果有任意排序要求,则创建一个列进行排序:

select a, (left(a, position('-' in a)), arbitrary_order)
from (
    select 'Cardiac - ACS' as a, 9 as arbitrary_order
    union 
    select 'Cardiac - All', 0
) s
order by 2, 1
;
       a       |       row       
---------------+-----------------
 Cardiac - All | ("Cardiac -",0)
 Cardiac - ACS | ("Cardiac -",9)

arbitrary_order 列的默认值将类似于 9 或 999,并且任意情况下的值会更低。

或者测试'-all'字符串是否存在

select a, (
    left(a, position('-' in a)),
    substring(a from position('-' in a)) != '- All'
    )
from (
    select 'Cardiac - ACS' as a
    union 
    select 'Cardiac - All'
) s
order by 2, 1
;
       a       |       row       
---------------+-----------------
 Cardiac - All | ("Cardiac -",f)
 Cardiac - ACS | ("Cardiac -",t)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2016-04-04
    • 2017-07-15
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多