Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:如果不满足条件,如何将1行作为默认值返回_Sql_Sql Server_Database - Fatal编程技术网

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

SQL Server:如果不满足条件,如何将1行作为默认值返回,sql,sql-server,database,Sql,Sql Server,Database,我有一个包含消息id字段、语言id字段和文本字段的消息表。 应用程序需要显示基于id和语言的消息,这些信息共同构成唯一密钥。所有消息都存在于语言EN中,但并非所有消息都已翻译成其他语言。因此,对于英语,将始终选择一个记录。但是,如果用户是法国人,应用程序需要显示消息17,而法语用户还不存在消息17,那么我想用英语返回消息17。我想在一个SELECT查询中完成这一点,最好不要使用IF语句 编辑:根据提交的答案-需要澄清的是,每条信息都被翻译成大约10种语言,也许更多。根据消息id和lang id,

我有一个包含消息id字段、语言id字段和文本字段的消息表。 应用程序需要显示基于id和语言的消息,这些信息共同构成唯一密钥。所有消息都存在于语言EN中,但并非所有消息都已翻译成其他语言。因此,对于英语,将始终选择一个记录。但是,如果用户是法国人,应用程序需要显示消息17,而法语用户还不存在消息17,那么我想用英语返回消息17。我想在一个SELECT查询中完成这一点,最好不要使用IF语句

编辑:根据提交的答案-需要澄清的是,每条信息都被翻译成大约10种语言,也许更多。根据消息id和lang id,应该始终只返回一行。但如果该行不存在,则应返回英文消息

最终代码: 声明@msgid int=2,@langid varchar2='fr' 选择isnullxx.msg、en.msg msgtext 来自Appen的消息 在en.msgid=xx.msgid和xx.langid=@langid上左键连接appmessages xx 其中en.langid='en'和en.msgid=@msgid

可以使用左连接和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'

一种简单的方法就是使用排序方式进行优先级排序:

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);
对于单个消息,性能通过消息\u tablemessage\u id、语言上的索引进行优化。两行上的order by很简单,因此应该非常快

这种方法还有一个很好的特点,即即使某些消息没有英文翻译,它也能工作。添加其他语言也非常简单,对处理时间的影响应该最小

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

DECLARE @RequestedLanguageId NCHAR(2)
DECLARE @RequestedMessageId INT

SET @RequestedLanguageId = 'FR'
SET @RequestedMessageId = 18

SELECT
    ISNULL(xx.message_text, en.message_text) AS MessageText
FROM message_table en
LEFT JOIN message_table xx
    ON xx.message_id = en.message_id
    AND xx.language_id = @RequestedLanguageId
WHERE   (en.language_id = 'EN')
    AND (en.message_id = @RequestedMessageId)
变量声明和设置使您能够测试这一点。

declare@msgid int=2,@langid varchar2='fr' 选择isnullxx.msg、en.msg msgtext 来自Appen的消息 在en.msgid=xx.msgid和xx.langid=@langid上左键连接appmessages xx
其中en.langid='en'和en.msgid=@msgid

请查看我的编辑。在lang不在的地方需要解决方案hardcoded@lkjp你怎么知道你想要什么语言?你可以用一个参数替换“French”,这样调用,fr.language=@primaryThank。这就是我要找的。您已经硬编码了邮件id,只有在邮件id 17是唯一被请求的情况下才有效。请查看我的编辑。如果lang不是硬编码的,则需要解决方案根据需要替换@lang\u id之类的参数,就像您可能对消息\u id所做的那样,它也不总是17。@shawnt00。这是对这个查询的一个微不足道的修改——只是用参数替换常量。您可以让它同时处理任意多个语言,甚至可以。
DECLARE @RequestedLanguageId NCHAR(2)
DECLARE @RequestedMessageId INT

SET @RequestedLanguageId = 'FR'
SET @RequestedMessageId = 18

SELECT
    ISNULL(xx.message_text, en.message_text) AS MessageText
FROM message_table en
LEFT JOIN message_table xx
    ON xx.message_id = en.message_id
    AND xx.language_id = @RequestedLanguageId
WHERE   (en.language_id = 'EN')
    AND (en.message_id = @RequestedMessageId)