我不知道這是我在一個很長的一天的後端,或者我已經得到了編碼器等效的編寫器塊,但我想不出一個乾淨的方式做到這一點。Tricky where子句
我有一個存儲網頁菜單結構的表,我想要一個簡單的存儲過程,它將根據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
對於給定的數據。例如,下面的需求是真實的:
- 頁ID 2應該只列出如果
@IsLoggedIn = 1
- 頁面ID 3只應列出如果
@IsLoggedIn = 1
和@IsAdmin = 1
- 頁面ID 4應該一直列出除非
@IsLoggedIn = 1
(有可能是需要登錄用戶(甚至管理員用戶)但仍然需要隱藏的頁面 - 這是我的大腦爆炸的位... ) - 頁ID 5應該是可見的所有的時間,無論用戶是否登錄或沒有,如果他們是管理員或不是因爲它不要求用戶名和它不是隱藏登錄用戶
你可以給樣品記錄以表格的形式? – 2013-03-10 22:10:39
我個人更喜歡你給它的格式。使得設置一個SQL小提琴更容易。 – 2013-03-10 22:20:58
關於#3,如果頁面同時設置了RequireLogin和HideIfLoggedIn,這是否意味着它應該被排除在外,而不管@ IsLoggedIn的值?或者一種偏好優先於另一種? – 2013-03-11 00:01:40