3

非常に長い一日のバックエンドにいるのか、ライターズブロックに相当するコーダーを持っているのかはわかりませんが、これを行うためのクリーンな方法は考えられません。

Webページのメニュー構造を格納するテーブルがあり、Webアプリケーションのセッションパラメータに基づいて関連するメニュー項目を返す簡単なストアドプロシージャが必要です。

次の(簡略化された)例を見てください。

--#### Create example table
CREATE TABLE [dbo].[tbl_Page](
    [PageID] [int] IDENTITY(1,1) NOT NULL,
    [RequireLogin] [bit] NOT NULL,
    [RequireAdmin] [bit] NOT NULL,
    [HideIfLoggedIn] [bit] NOT NULL
)
GO

--#### Insert Dummy Data
SET IDENTITY_INSERT [dbo].[tbl_Page] ON
INSERT [dbo].[tbl_Page] ([PageID], [RequireLogin], [RequireAdmin], [HideIfLoggedIn]) VALUES (2, 1, 0, 0)
INSERT [dbo].[tbl_Page] ([PageID], [RequireLogin], [RequireAdmin], [HideIfLoggedIn]) VALUES (3, 1, 1, 0)
INSERT [dbo].[tbl_Page] ([PageID], [RequireLogin], [RequireAdmin], [HideIfLoggedIn]) VALUES (4, 0, 0, 1)
INSERT [dbo].[tbl_Page] ([PageID], [RequireLogin], [RequireAdmin], [HideIfLoggedIn]) VALUES (5, 0, 0, 0)
SET IDENTITY_INSERT [dbo].[tbl_Page] OFF

--#### Create menu procedure
CREATE PROCEDURE usp_GetSubMenu
    @ParentID INT ,
    @IsLoggedIn BIT ,
    @IsAdmin BIT
AS 
    BEGIN
        SET NOCOUNT ON;

        SELECT  PageID ,
                RequireLogin ,
                RequireAdmin ,
                HideIfLoggedIn
        FROM    tbl_Page
        WHERE ????????????
    END
GO

与えられたサンプルデータの場合、次のことが当てはまる必要があります。

  1. ページID2は、次の場合にのみリストする必要があります@IsLoggedIn = 1
  2. ページID3は、@IsLoggedIn = 1 ANDの場合にのみリストする必要があります @IsAdmin = 1
  3. ページID4は、(ログインユーザー(および管理者ユーザー)を必要とするが、それでも非表示にする必要があるページがある場合を除いて、常にリストする必要があります-これは私の脳が爆発するビットです... @IsLoggedIn = 1
  4. ページID5は、ユーザーがログインしているかどうかに関係なく、また管理者であるかどうかに関係なく、ログインを必要とせず、ログインしたユーザーに対して非表示にされないため、常に表示される必要があります。
4

3 に答える 3

2
select PageID,
  RequireLogin,
  RequireAdmin,
  HideIfLoggedIn
from tbl_Page
where (HideIfLoggedIn <> @IsLoggedIn)
  and (RequireLogin = 0 or @IsLoggedIn = 1)
  and (RequireAdmin = 0 or @IsAdmin = 1)

私のために働きます。

コメント後に編集:

select PageID,
  RequireLogin,
  RequireAdmin,
  HideIfLoggedIn
from tbl_Page
where ((HideIfLoggedIn <> @IsLoggedIn)
  and (RequireLogin = 0 or @IsLoggedIn = 1)
  and (RequireAdmin = 0 or @IsAdmin = 1))
  or (RequireLogin = 0 and RequireAdmin = 0 and HideIfLoggedIn = 0)

最後の要件を満たすようにクエリを更新し、次のSQLフィドルを更新しました。

SQLFiddlefor@IsLoggedIn = 1, IsAdmin = 0 - PageID 2,5が表示されます。

SQLFiddlefor@IsLoggedIn = 1, IsAdmin = 1 - PageID 2,3,5が表示されます。

SQLFiddlefor@IsLoggedIn = 0, IsAdmin = 1 - PageID 4,5が表示されます。

于 2013-03-10T22:10:47.360 に答える
1
SELECT  PageID ,
            RequireLogin ,
            RequireAdmin ,
            HideIfLoggedIn
    FROM    tbl_Page
    WHERE 
   (@IsLoggedIn = 1 AND [HideIfLoggedIn] = 0) 
   AND [RequireLogin] = @IsLoggedIn
   AND [RequireAdmin] = @IsAdmin         
于 2013-03-10T22:11:05.673 に答える
1

where句が否定を中心に構成されている場合、これは読みやすくなると思います...

SELECT 
    PageID,
    RequireLogin,
    RequireAdmin,
    HideIfLoggedIn
FROM 
    tbl_Page
WHERE 
    NOT
    (
       (HideIfLoggedIn = 1 AND @IsLoggedIn = 1)
       OR (RequireLogin = 1 AND @IsLoggedIn = 0)
       OR (RequireAdmin = 1 AND @IsAdmin = 0)
    )
于 2013-03-11T00:05:19.820 に答える