Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 WHERE子句中是否存在IF_Sql_Sql Server_Where_Exists - Fatal编程技术网

Sql WHERE子句中是否存在IF

Sql WHERE子句中是否存在IF,sql,sql-server,where,exists,Sql,Sql Server,Where,Exists,这几天我遇到了一个问题。在我的MS SQL数据库中,我有一个文章详细信息表,如插入日期、插入用户和其他员工,还有一个包含多种语言的文章正文的表。我希望文章主体采用用户首选的语言。但并不是所有的文章都用所有的语言。所以,最好先用用户喜欢的语言搜索文章,如果不存在,就用第一语言获取文章的正文 为此,我使用了一个函数。WHERE子句如下所示: WHERE [tblBody].[Language] = @Language AND [tblTitle].[Language] = @La

这几天我遇到了一个问题。在我的MS SQL数据库中,我有一个文章详细信息表,如插入日期、插入用户和其他员工,还有一个包含多种语言的文章正文的表。我希望文章主体采用用户首选的语言。但并不是所有的文章都用所有的语言。所以,最好先用用户喜欢的语言搜索文章,如果不存在,就用第一语言获取文章的正文

为此,我使用了一个函数。WHERE子句如下所示:

WHERE   [tblBody].[Language] = @Language AND
        [tblTitle].[Language] = @Language
但如果是这样的话就太好了: 选择主体是否使用我的首选语言获取该主体;否则给我一个也许我能理解

我希望你明白我想做什么,这是我的问题

提前谢谢你

更新

这是我的实际查询,需要修改:

 ALTER FUNCTION [fx_GetNews]
(   
    @MinimumPermission INT,
    @UserID UNIQUEIDENTIFIER,
    @OwnerID  UNIQUEIDENTIFIER = NULL,
    @Title NVARCHAR(250) = NULL,
    @Body VARCHAR(150) = NULL,
    @InsertDateStart DATETIME = NULL,
    @InsertDateEnd DATETIME = NULL,
    @CreatedByUserID UNIQUEIDENTIFIER = NULL,
    @ExpirationDate DATETIME = NULL,
    @Language VARCHAR(150)
)
RETURNS @News TABLE 
(
    [Id] UNIQUEIDENTIFIER
    ,[OwnerID] UNIQUEIDENTIFIER
    ,[Title] NVARCHAR(250)
    ,[TitlePictureUrl] VARCHAR(150)
    ,[Body] NVARCHAR(max)
    ,[Visible] BIT
    ,[InsertDate] DATETIME
    ,[CreatedByUserId] UNIQUEIDENTIFIER
    ,[ModifiedDate] DATETIME
    ,[ModifiedByUserId] UNIQUEIDENTIFIER
    ,[ModifiedByPerson] VARCHAR(250)
    ,[ExpirationDate] DATETIME
    ,[CreatedByPerson] VARCHAR(250)
    ,[Permission] INT
)
AS
BEGIN
    INSERT INTO @News
           ([Id]
           ,[OwnerID]
           ,[Title]
           ,[TitlePictureUrl]
           ,[Body]
           ,[Visible]
           ,[InsertDate]
           ,[CreatedByUserId]
           ,[ModifiedDate]
           ,[ModifiedByUserId]
           ,[CreatedByPerson]
           ,[ModifiedByPerson]
           ,[ExpirationDate]
           ,[Permission])
        SELECT
                [dbo].[tblNews].[Id]
               ,[dbo].[tblNews].[OwnerID]
               ,CAST([tblTitle].[Text] AS VARCHAR(150))
               ,[dbo].[tblNews].[TitlePictureUrl]
               ,[tblBody].[Text]
               ,[dbo].[tblNews].[Visible]
               ,[dbo].[tblNews].[InsertDate]
               ,[dbo].[tblNews].[CreatedByUserId]
               ,[dbo].[tblNews].[ModifiedDate]
               ,[dbo].[tblNews].[ModifiedByUserId]
               ,[dbo].[tblNews].[CreatedByPerson]
               ,[dbo].[tblNews].[ModifiedByPerson]
               ,[dbo].[tblNews].[ExpirationDate]
               ,[eportofolii].[fx_GetPermissionForObject] (@UserID, [dbo].[tblNews].[ID], 1, 1)
           FROM [dbo].[tblNews] 
                    INNER JOIN [dbo].[tblAdmTranslateText] AS [tblBody] ON
                        [tblBody].[OwnerID] = [dbo].[tblNews].[ID]
                    INNER JOIN [dbo].[tblAdmTranslateText] AS [tblTitle] ON
                        [tblTitle].[OwnerID] = [dbo].[tblNews].[ID]
        WHERE
            [eportofolii].[fx_GetPermissionForObject] (@UserID, [dbo].[tblNews].[ID], 1, 1) >= @MinimumPermission AND
            ([dbo].[tblNews].[OwnerID] = ISNULL(@OwnerID, [dbo].[tblNews].[OwnerID]) OR [dbo].[tblNews].[OwnerID] IS NULL) AND
            [tblTitle].[Text] LIKE '%' + ISNULL(@Title, '') + '%' AND
            [tblBody].[Text] LIKE '%' + ISNULL(@Body, '') + '%' AND
            ([dbo].[tblNews].[InsertDate] BETWEEN ISNULL(@InsertDateStart, ([dbo].[tblNews].[InsertDate] - 7)) AND ISNULL(@InsertDateEnd, [dbo].[tblNews].[InsertDate] + 1)) AND
            [dbo].[tblNews].[CreatedByUserID] = ISNULL(@CreatedByUserID, [dbo].[tblNews].[CreatedByUserID]) AND
            ([dbo].[tblNews].[ExpirationDate] > ISNULL(@ExpirationDate, GETDATE() - 1) OR [dbo].[tblNews].[ExpirationDate] IS NULL) AND
            [tblBody].[UDF_2] = 'Body' AND 
            [tblTitle].[UDF_2] = 'Title' AND 
            [tblBody].[UDF_1] = 'News' AND 
            [tblTitle].[UDF_1] = 'News' AND
            [tblBody].[Language] = @Language AND
            [tblTitle].[Language] = @Language
        ORDER BY [InsertDate] DESC
    RETURN
END
最后的问题是:

[tblBody].[Language] = @Language AND
[tblTitle].[Language] = @Language

谢谢大家!

一个选项是使用MSSQL合并函数:


另一种可能是使用CASE块。

您想做的事情有点复杂。您希望返回所需语言的文章(如果有),如果没有,则返回另一种语言的文章

为此,窗口函数非常有用:

select t.*
from (select blah,
             max(case when [tblBody].[Language] = @Language then 1 else 0 end) over (partition by article) as HasLanguage       
      from whatever
      where [tblTitle].[Language] = @Language
     ) t
where HasLanguage = 1 or [tblBody].[Language] <> @Language 
如果首选语言不可用,这将返回任意语言。您可以通过修改内部顺序来进一步细化


您必须在两种语言中进行选择:用户语言和文章语言。可以使用并集或合并,因为外部联接是一种并集,后者更简单

否则给你哪一个?另外,请选择哪个版本的SQL Server?您是否真的将文章的正文和标题存储在单独的表中?出版日期是否有第三个表,作者id是否有第四个表,等等。?如果您显示实际的表结构以及它们之间的关系,您可能会得到工作查询而不是猜测…有一个新闻详细信息表发布日期、作者。。。还有一个有不同语言的文本。第二个表包括不同行的标题和正文。
;WITH x AS 
(
   SELECT b.[Language], /* other columns from b */
     rn = ROW_NUMBER() OVER (PARTITION BY b.article_id_of_some_kind
       ORDER BY CASE WHEN t.[Language] = @Language THEN 1 ELSE 2 END)
   FROM dbo.tblBody AS b
   INNER JOIN dbo.tblLanguage AS l
    ON b.LanguageID = l.LanguageID -- guessing here
)
SELECT /* cols */ FROM x WHERE rn = 1;
select B.*
from bodies as B
where exists (
  select 1 from (
    select b.article, coalesce( u.language, b.language ) as language
    from bodies as b 
    left join users as u
    on b.language = u.language
    and u.user = @user
    where b.article = @article
    and b.default_language = 'TRUE' -- or whatever
  ) as A
  on A.article = B.Article
  and A.language = B.language
)