代码之家  ›  专栏  ›  技术社区  ›  yglodt

按Postgres hstore属性排序未按预期工作

  •  1
  • yglodt  · 技术社区  · 6 年前

    我使用Postgres 10.4,在一个简单的查询中得到一个奇怪的排序行为。

    我的表定义如下:

    CREATE TABLE country (
        id           varchar(2)   NOT NULL PRIMARY KEY,
        order_by     smallint,
        app_locale   boolean      DEFAULT false NOT NULL,
        country      boolean      DEFAULT false NOT NULL,
        lang         boolean      DEFAULT false NOT NULL,
        nationality  boolean      DEFAULT false NOT NULL,
        c_name       hstore,
        l_name       hstore,
        n_name       hstore,
        active       boolean      DEFAULT false NOT NULL,
        language     varchar(6)
    );
    

    这个简单的查询应该返回按英语国家名排序的国家:

    select id, c_name
    from country c
    where active = true
    and   c.nationality = true
    and   id in ('de','fr','be','lu','kz','af','ad') -- limit the result a bit
    order by c.n_name -> 'en'
    

    意外的结果是:

    id  c_name
    be  "de"=>"Belgien", "lb"=>"Belsch", "en"=>"Belgium", "fr"=>"Belgique"
    fr  "de"=>"Frankreich", "lb"=>"Frankräich", "en"=>"France", "fr"=>"France"
    de  "de"=>"Deutschland", "lb"=>"Däitschland", "en"=>"Germany", "fr"=>"Allemagne"
    lu  "de"=>"Luxemburg", "lb"=>"Lëtzebuerg", "en"=>"Luxembourg", "fr"=>"Luxembourg"
    ad  "en"=>"Andorra"
    kz  "en"=>"Kazakhstan"
    af  "de"=>"Afghanistan", "en"=>"Afghanistan", "fr"=>"Afghanistan"
    

    这里有什么问题?

    1 回复  |  直到 6 年前
        1
  •  4
  •   klin    6 年前

    你用错了 order by :

    select id, c_name
    from country c
    where active = true
    and c.nationality = true
    and id in ('de','fr','be','lu','kz','af','ad')
    order by c_name -> 'en'