IIF в разделе Где часть на SQL Select - PullRequest
0 голосов
/ 10 июля 2019

Предположение, что это мои данные

CREATE TABLE tbUsers (
idUser INT PRIMARY KEY,
nameUser VARCHAR(20),
levelUser BIT
);

INSERT INTO tbUsers VALUES (1,'Cindy',1),(2,'Philip',0),(3,'Veron',0);

CREATE TABLE tbTransactions (
    idTransaction BIGINT PRIMARY KEY,
    dateTransaction DATE,
    idUserInput INT
);

INSERT INTO tbTransactions VALUES (1,'2019-07-01',1),(2,'2019-07-05',1),(3,'2019-07-05',3);

Уровень пользователя имеет 2: Admin (1) и Standard (0)

Я хочу, если пользователь, который просматривает транзакцию, имеет уровень администратора (1), чем он / она может просматривать все данные. Но если уровень Standard (0), он может просматривать только свои данные.

Если я использую утверждение IF, я могу достичь своей цели. Это ЕСЛИ код:

DECLARE @parLevelUser BIT = 1;
DECLARE @parIdUserView INT = 3;

IF(@parLevelUser=1)
    SELECT * FROM tbTransactions WHERE idUserInput IN (SELECT idUser FROM tbUsers)
ELSE
    SELECT * FROM tbTransactions WHERE idUserInput IN (SELECT @paridUserView)

Как написать в заявлении IIF? Я пишу этот код, но показываю ошибку.

DECLARE @parLevelUser BIT = 1;
DECLARE @parIdUserView INT = 3;
SELECT * FROM tbTransactions WHERE idUserInput IN (IIF(@parLevelUser=1,(SELECT idUser FROM tbUsers),(SELECT @paridUserView)));

Сообщение об ошибке: Подзапрос вернул более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Если я понимаю значение ваших переменных, вы можете сделать это следующим образом:

SELECT * FROM tbTransactions 
WHERE idUserInput = IIF(
  @parLevelUser = 0,
  @paridUserView,
  idUserInput
);

Если @parLevelUser = 0 (это означает, что пользователь не является администратором, верно?), То WHEREпредложение будет:

WHERE idUserInput = @paridUserView

, и пользователи будут видеть только свои строки.Если @parLevelUser = 1 (это означает, что пользователь является администратором, верно?), Тогда предложение WHERE будет:

WHERE idUserInput = idUserInput 

, которое возвращает true для всех строк, поэтому администратор увидит все строки,Редактировать.Вы можете получить уровень пользователя от tbUsers вместо использования переменной @parLevelUser:

SELECT * FROM tbTransactions 
WHERE idUserInput = IIF(
  (select levelUser from tbUsers where idUser = @paridUserView) = 0,
  @paridUserView,
  idUserInput
);
1 голос
/ 10 июля 2019

Вы не можете сделать это с выражением IIF. Ваш IF-код является правильным способом сделать это.

Кстати, исходя только из ваших примеров данных, совсем не нужно использовать фильтр для «администраторов». Если они могут просто увидеть все данные, то все, что вам нужно сделать, это:

WHERE @parLevelUser=1 OR idUserInput=@paridUserView
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...