我不知道这是我在一个很长的一天的后端,或者我已经得到了编码器等效的编写器块,但我想不出一个干净的方式做到这一点。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