postgresql Postgres -根据值或自定义默认值筛选

ss2ws0br  于 2023-03-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(243)

假设locale_info表为给定的locale存储了多个items

CREATE TABLE locale_info (
  locale TEXT,
  item_id TEXT
)

如果表中没有给定search_locale的条目,则为给定search_locale或默认locale选择项目的最简洁方法是什么?
我使用以下代码:

SELECT *
FROM locale_info
WHERE locale = COALESCE(
  (SELECT DISTINCT (locale) FROM locale_info WHERE locale = 'en_ZA'), 
  'en'
);

如果存在en_ZA项,则返回en_ZA项,否则返回默认的en区域设置。
我的问题是:如何以更干净的Postgres方式重写这个相当难看的查询?

jk9hmnmh

jk9hmnmh1#

我能想到的一种方法是使用UNION ALL,其中第二部分仅在第一部分返回一行时才运行:

with requested as (
  SELECT *
  FROM locale_info
  WHERE locale = 'en_ZA'
)
select *
from requested
union all
SELECT *
FROM locale_info
where locale = 'en'
  and not exists (select * from requested);

另一种选择是始终选择两个语言环境,但按“重要性”对其进行排序,并丢弃第二个:

select *
from locale_info
where locale in ('en_ZA', 'en')
order by locale = 'en_ZA' desc
limit 1;

对布尔值排序时,false排在true之前,因此通过对DESCending排序,包含所需语言环境的行排在前面。
在任何情况下,您都应该在locale列上有一个索引(或者该列是第一列的索引)

相关问题