Я не знаю, если я нахожусь на заднем конце очень длинного дня или у меня есть кодер, эквивалентный сценаристам, но я не могу придумать, как это сделать.Tricky where clause
У меня есть таблица, в которой хранится структура меню веб-страниц, и я хочу, чтобы простая хранимая процедура возвращала соответствующие пункты меню на основе параметров сеанса в веб-приложении.
Рассмотрим следующий (упрощенный) пример:
--#### 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
- Идентификатор страницы 3 следует указывать только в том случае, если
@IsLoggedIn = 1
И@IsAdmin = 1
- Идентификатор страницы 4 должен быть указан постоянно UNLESS
@IsLoggedIn = 1
(могут быть страницы, для которых требуется зарегистрированный пользователь (и даже пользователь admin), но все же нужно скрывать - это бит, где мой мозг взрывается ...) - Page ID 5 должны быть видны все время, независимо, если пользователь вошел в систему или нет, и если они являются администратором или нет, поскольку он не требует логина и оно не скрыто для зарегистрированных пользователей
вы можете дать записи образца в табличном формате? –
Я лично предпочитаю формат, который вы ему дали. Делает упрощение настройки SQL-скрипта. –
Что касается № 3, если на странице есть как 'RequireLogin', так и' HideIfLoggedIn', это означает, что это должно быть исключено независимо от значения '@ IsLoggedIn'? Или одно предпочтение имеет приоритет над другим? –