当前位置:  开发笔记 > 编程语言 > 正文

SQL Server:如果未满足条件,如何将1行作为默认值返回

如何解决《SQLServer:如果未满足条件,如何将1行作为默认值返回》经验,为你挑选了2个好方法。

我有一个消息表,其中包含消息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



1> Chris Stillw..:

您可以使用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'



2> Gordon Linof..:

一种简单的方法只是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两行是微不足道的,所以它应该是非常快的.

即使某些消息没有英文翻译,这种方法也具有很好的特性.添加其他语言也非常简单,对处理时间的影响应该很小.

对于多个消息,您可以使用窗口函数执行类似的操作,但这将是一个不同的问题.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有