我正在尝试选择特定语言的行,如果不是我想获得默认行。 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使用空间。
在这种情况下,最佳解决方案是什么?
关于“最佳方法”和您的问题,有几点仍然是开放的。虽然,我相信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)或排序可能足够好,还有很多其他方法。
第二种解决方案应该更快,似乎接近更快速度的最终结果,访问首选语言并搜索车辆名称。
我希望这有帮助!