postgres 简单数字到字符串映射

Sam*_* R. 6 postgresql query case

Enum在编程语言级别有一个 an ,它作为一个简单的整数存储在表上。思考:

APPLE = 1
GOOGLE = 2
MSFT = 3
AMAZON = 4
 ... (100s more)
Run Code Online (Sandbox Code Playgroud)

我只想查询表而不是数字返回相应的字符串值。在不使用case语句或临时表的情况下,是否有更简单的方法来执行此操作:

SELECT
  CASE WHEN type = 1 THEN "APPLE"
  CASE WHEN type = 2 THEN "GOOGLE"
  CASE WHEN type = 3 THEN "MSFT"
  CASE WHEN type = 4 THEN "AMAZON"
  ...
  ELSE "UNKNOWN"
FROM t
Run Code Online (Sandbox Code Playgroud)

基本上它只是在字典中进行键查找。

McN*_*ets 8

恕我直言,最简单的方法是使用查找表。

create table lk (id int, name text);

insert into lk values
(1, 'apple'),(2, 'google'),(3, 'msft'),(4, 'amazon');

create table t (id serial, lk int);
insert into t (lk) values (2),(1),(3),(4);

select
    t.id,
    lk.name
from   t
join   lk
       on lk.id = t.lk;
Run Code Online (Sandbox Code Playgroud)
身份证 | 姓名  
-: | :-----
 2 | 苹果
 1 | 谷歌
 3 | msft  
 4 | 亚马逊

db<>在这里摆弄


and*_*ter 6

JSON FTW。作为一名 JS 开发人员,我偏爱对象映射。下面是 PG 中的示例:

SELECT COALESCE(
  (
    (json_build_object(
      1, 'APPLE',
      2, 'GOOGLE',
      3, 'MSFT',
      4, 'AMAZON'
    )::jsonb
  )->>(2::text))::text,
  'UNKNOWN'
); 
-- RETURNS 'GOOGLE'
Run Code Online (Sandbox Code Playgroud)


Sam*_* R. 5

好吧,使用 @McNets 的答案,我使用了with没有临时表的子句:

create table t (id serial, lk int);
insert into t (lk) values (2),(1),(3),(4);

with m (k, v) as (values (1, 'apple'),(2, 'google'),(3, 'msft'),(4, 'amazon'))
select t.id, m.v
from t
join m
  on m.k = t.lk;
Run Code Online (Sandbox Code Playgroud)

  • 不同之处在于,当您需要在映射中添加新条目时,您将需要更改代码或包含上述内容的某些存储过程/视图(使用“CASE”也会出现同样的问题),而使用表您只需要插入一行,影响很小。如果您的映射像您所说的那样具有数百个值,那么这样的“with”语句将不会很漂亮。您不需要“临时”表,只需使用映射一次性创建一个表,就可以永远完成设计。 (2认同)