多语言选择sql

问题描述 投票:0回答:1

我正在尝试选择特定语言的行,如果不是我想获得默认行。 lang_id = 1的翻译永远存在。

我有这样一张桌子:

car_id | name | lang_id

这是我的选择

select  c1.*,
        COALESCE(c2.name, c1.name) as name
        from cars c1
        left join cars c2 on c1.car_id= c2.car_id and c2.lang_id=2
        where c1.lang_id = 1 limit 10;

但我想在名称上应用过滤器以便能够按名称搜索。我知道我可以在c2.name ilike等地方申请更多的陈述......但我觉得这不是正确的方法。

也会更好地避免加入......

我想这里有一种方法:在新插入中添加默认语言名称中所有语言的记录,以避免以后加入。但这将增加db使用空间。

在这种情况下,最佳解决方案是什么?

sql postgresql multilingual
1个回答
1
投票

关于“最佳方法”和您的问题,有几点仍然是开放的。虽然,我相信CASE WHEN会帮助你:https://www.postgresql.org/docs/9.5/static/functions-conditional.html

第二种解决方案是利用一个组,并简单地将不同的名称/语言聚合成一个聚合函数。

这是第一个解决方案:

例如,在您的查询中,CASE WHEN可以引用您的连接条件:

select  c1.*,
    COALESCE(c2.name, c1.name) as name,
    CASE 
      WHEN c2.lang_id=2 
        THEN c2.name
      ELSE c1.name
    END as name2

    from cars c1
    left join cars c2 on c1.car_id= c2.car_id and c2.lang_id=2
    CASE 
      WHEN c2.lang_id=2 
        THEN c2.name LIKE '%honda%'
      ELSE c1.name LIKE '%honda%'
    END 
    where c1.lang_id = 1 limit 10;

我在选择区域和连接条件中都使用了CASE WHEN,以表明它不仅限于选择列。

第二个解决方案

 select car_id, array_agg(name) as names, array_agg(lang_id order by lang_id) langids
   from cars 
   where name like '%honda%'
   group by car_id

现在汇总结果,您可以在每一行中选择:首先显示哪种语言(可能需要CASE WHEN)或排序可能足够好,还有很多其他方法。

第二种解决方案应该更快,似乎接近更快速度的最终结果,访问首选语言并搜索车辆名称。

我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.