【问题标题】:Select value from an enumerated list in PostgreSQL从 PostgreSQL 的枚举列表中选择值
【发布时间】:2013-04-04 14:35:37
【问题描述】:

我想从不在数据库中的枚举中进行选择。

例如SELECT id FROM my_table 返回值 1、2、3 我想显示1 -> 'chocolate', 2 -> 'coconut', 3 -> 'pizza' 等。SELECT CASE 有效,但对于许多值来说太复杂且难以概述。我想到了类似的东西

SELECT id, array['chocolate','coconut','pizza'][id] FROM my_table

但我无法使用数组成功。有简单的解决方案吗?所以这是一个简单的查询,而不是 plpgsql 脚本或类似的东西。

【问题讨论】:

    标签: postgresql postgresql-8.1


    【解决方案1】:
    with food (fid, name) as (
      values 
         (1, 'chocolate'),
         (2, 'coconut'),
         (3, 'pizza')
    )
    select t.id, f.name
    from my_table t
      join food f on f.fid = t.id;
    

    或没有 CTE(但使用相同的想法):

    select t.id, f.name
    from my_table t
      join (
         values 
           (1, 'chocolate'),
           (2, 'coconut'),
           (3, 'pizza')
      ) f (fid, name) on f.fid = t.id;
    

    【讨论】:

      【解决方案2】:

      这是正确的语法:

      SELECT id, (array['chocolate','coconut','pizza'])[id] FROM my_table
      

      但是您应该使用这些值创建一个引用表。

      【讨论】:

      • 谢谢!!!这是我一直在寻找的简单解决方案并且它有效。只是缺少括号。 (我曾经说过我不想创建表,因为数据库不是我的,这是一个随意的查询,但有人用我的评论删除了这个答案。)
      【解决方案3】:

      如何创建另一个表来枚举所有案例并进行连接?

      CREATE TABLE table_case
      (
        case_id bigserial NOT NULL,
        case_name character varying,
        CONSTRAINT table_case_pkey PRIMARY KEY (case_id)
      )
      WITH (
        OIDS=FALSE
      );
      

      当您从表格中选择时:

      SELECT id, case_name FROM my_table 
      inner join table_case on case_id=my_table_id;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多