我有一个消息表,其中包含消息ID字段,语言ID字段和文本字段.应用程序需要根据id和语言显示消息,这些消息一起构成唯一键.所有消息都存在于语言中EN
,但并非所有消息都已翻译成其他语言.因此,对于英语,将始终选择一个记录.但是如果用户是法语并且应用程序需要显示消息#17并且它还不存在法语,我想要返回消息#17 in EN
.我想在一个SELECT
查询中完成此操作,最好没有IF
语句.
编辑:根据提交的答案 - 需要澄清每条消息被翻译成大约10种语言,也许更多.有应该总是恰好 一个基于消息ID和郎ID返回行.但如果该行不存在,则应返回英文消息.
最终代码:
declare @msgid int=2, @langid varchar(2)='fr'
SELECT isnull(xx.msg, en.msg) msgtext
FROM appmessages en
LEFT JOIN appmessages xx ON en.msgid = xx.msgid and xx.langid=@langid
WHERE en.langid = 'en' and en.msgid=@msgid
您可以使用LEFT JOIN
,并ISNULL
为实现这一
SELECT ISNULL(fr.message, en.message) AS message FROM message_table en LEFT JOIN message_table fr ON fr.message_id = en.message_id AND fr.language = 'French' WHERE en.message_id = 17 AND en.language = 'English'
一种简单的方法只是order by
用于优先级排序:
select top 1 mt.* from message_table mt where mt.message_id = 17 and mt.language in ('French', 'English') order by (case when mt.language = 'French' then 1 else 2 end);
对于单个消息,性能将通过索引进行优化message_table(message_id, language)
.在order by
两行是微不足道的,所以它应该是非常快的.
即使某些消息没有英文翻译,这种方法也具有很好的特性.添加其他语言也非常简单,对处理时间的影响应该很小.
对于多个消息,您可以使用窗口函数执行类似的操作,但这将是一个不同的问题.