使用默认回退的 SQL 连接

标签 sql database postgresql

我有一个名为 movies 的表,其中包含两列,descriptionlonger_description。这些列包含用于获取翻译的翻译键。我设法使用连接获取翻译,但如果找不到翻译,我想回退到默认语言环境。

我有一个这样的数据库结构:

电影表

movies
---------------------------------------
name | description | longer_description

本地化表

localizations 
------------------------------
textkey | locale | translation

使用 textkey + locale 作为主键。

电影的示例数据:

name         | description        | longer_description
-------------------------------------------------------------
Batman movie | batman.description | batman.longer_description

这些值用于匹配本地化表中的文本键:

本地化示例数据:

textkey                   | locale | translation
---------------------------------------------------------------
batman.description        | en     | english description
batman.longer_description | en     | english longer description

我想要实现的是使用给定的文本键 + 语言环境进行查询,如果存在翻译:选择,如果不存在:回退到默认的 en 语言环境。

SELECT
    m.name,
    t1.translation AS description,
    t2.translation AS long_description
FROM
    movies m
LEFT OUTER JOIN
    localizations t1
ON
    t1.language = 'sv' AND
    t1.text_key = m.description
LEFT OUTER JOIN
    localizations t2
ON
    t2.language = 'sv' AND
    t2.text_key = m.long_description
ORDER BY
    m.name

这会得到我想要的翻译,但它不会解决翻译不存在并且我需要回退到 en 语言环境的情况。

最佳答案

为此使用存储函数:

create function fn_get_translation(p_key text, p_language text) returns text static strict language sql as $$
  select
    translation
  from
    localizations l join 
      (values(1,p_language),(2,'en')) as lng(ord,code) on (l.locale = lng.code)
  where
    l.text_key = p_key
  order by
    lng.ord
  limit 1
$$;

免责声明:功能未经测试,但我相信您能够修复可能的错误。

然后查询会更简单:

select
  m.name,
  fn_get_translation(m.description, 'sv') as description,
  fn_get_translation(m.long_description, 'sv') as long_description
from
  movies m;

关于使用默认回退的 SQL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40016493/

相关文章:

php - 在 WordPress 中查询自定义表以首先返回最新行

mysql - SQL 查询更新一系列字段 - MySQL 表

mysql - 数据库模式困惑(索引和约束)

sql - 按关联字段排序的 Rails

postgresql - 在简单的读写上激发 OOM

sql - 检索每个客户的最新记录

java - 从 java 导入 MySQL DB 不起作用

java - 如何告诉 JPA 使用简单类的字段作为持久值?

python - 如何使用 SQLAlchemy 核心选择除 postgresql 中 1 个特定列之外的所有表列?

php - 使用 laravel orm 选择自定义字段