0

この日、問題が発生しました。私のMS SQLデータベースには、記事のテーブル(挿入日、挿入ユーザー、その他のスタッフなどの詳細)と、記事の本文を複数の言語で含む1つのテーブルがあります。記事の本文をユーザーが好む言語にしたいと考えています。しかし、すべての記事がすべての言語で書かれているわけではありません。したがって、最初にユーザーの優先言語で記事を検索し、存在しない場合は、最初の言語で本文を取得するとよいでしょう。

このために、関数を使用します。WHERE 句は次のようになります。

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

SELECT (body が私の好みの言語の場合はその body を取得し、そうでない場合は 1 つください (多分私はそれを理解しました))

私がやりたいことと魔女が私の問題であることを理解していただければ幸いです。

前もって感謝します!

アップデート

これは、変更が必要な私の実際のクエリです。

 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

ありがとうございました!

4

4 に答える 4

-1

1 つのオプションは、MSSQL の "COALESCE" 関数を使用することです。

もう 1 つは、CASE ブロックを使用することです。

于 2013-03-30T20:54:28.733 に答える