gpt4 book ai didi

sql - 棘手的 where 子句

转载 作者:行者123 更新时间:2023-12-01 12:46:31 26 4
gpt4 key购买 nike

我不知道是因为我在漫长的一天的后端工作,还是我遇到了相当于编写者 block 的编码器,但我想不出一种干净的方法来做到这一点。

我有一个存储网页菜单结构的表,我想要一个简单的存储过程,它会根据 Web 应用程序中的 session 参数返回相关的菜单项。

以下面的(简化的)例子为例:

--#### 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. 仅当 @IsLoggedIn = 1
  2. 时才应列出页面 ID 2
  3. 仅当 @IsLoggedIn = 1 AND @IsAdmin = 1
  4. 时才应列出页面 ID 3
  5. 页面 ID 4 应该一直列出 UNLESS @IsLoggedIn = 1(很可能有些页面需要登录用户(甚至是管理员用户)但仍然需要隐藏 - 这是我的大脑爆炸的地方......)
  6. 页面 ID 5 应该始终可见,无论用户是否登录,也无论他们是否是管理员,因为它不需要登录,也不会对登录用户隐藏

最佳答案

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 Fiddles:

SQL Fiddle对于 @IsLoggedIn = 1,IsAdmin = 0 - PageID 2,5 显示。

SQL Fiddle对于 @IsLoggedIn = 1,IsAdmin = 1 - PageID 2,3,5 显示。

SQL Fiddle对于 @IsLoggedIn = 0,IsAdmin = 1 - PageID 4,5 显示。

关于sql - 棘手的 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15328124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com