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)
基本上它只是在字典中进行键查找。
恕我直言,最简单的方法是使用查找表。
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<>在这里摆弄
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)
好吧,使用 @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)