2015-08-10 3 views
0

У меня есть следующая скалярная функция, эта функция сравнивает значения между одним пользователем и другим, если они совпадают, и возвращает true, иначе false.условие case case и проверка наличия записи

Функция выглядит следующим образом:

SELECT TOP 1 CASE WHEN us.UserId IS NULL THEN 0 ELSE 1 END AS does_data_match 
    FROM [User].[User_Profile] up 
    INNER JOIN [User].[User_Details] d ON up.Id = d.UserId 
    LEFT OUTER JOIN [user].[User_Settings] us 
    ON us.UserId = @UserId1 
    AND d.Height between ISNULL(us.HeightFrom, d.height) and ISNULL(us.HeightTo, d.Height) 
    AND up.Age between ISNULL(us.AgeFrom, up.age) and ISNULL(us.AgeTo, up.Age) 
    AND up.Gender = ISNULL(us.Gender, up.Gender) 
    WHERE up.id = @UserId2 
    ORDER BY up.id ASC 

У меня есть проблема с этой функцией иногда User.User_Settings не содержит записи для @ userid1 поэтому по умолчанию он должен возвращать-позволяя @ UserId2 связаться но он возвращает 0 из-за оператора case, я включил 0 и 1 в аргументе case, но при этом функция возвращала неверные результаты, когда @ UserId1 существует в таблице настроек.

Я попытался установить его с помощью инструкции If, чтобы проверить, выйдет ли @ UserId1 в таблице пользовательских настроек, если это произойдет, запустите оператор case, иначе выберите 1 (true) по умолчанию.

Но по какой-то причине это не позволит мне иметь оператор If в скалярной функции?

Любая помощь будет оценена по достоинству.

Update

Это то, что мой casestatement выглядит, когда я оберните его в IF Заявление

IF EXISTS(Select Userid from [user].[User_Settings] where UserId = @UserId1) 
    BEGIN 
     SELECT TOP 1 CASE WHEN us.UserId IS NULL THEN 0 ELSE 1 END AS does_data_match 
     FROM [User].[User_Profile] up 
     INNER JOIN [User].[User_Details] d ON up.Id = d.UserId 
     LEFT OUTER JOIN [user].[User_Settings] us 
     ON us.UserId = @UserId1 
     AND d.Height between ISNULL(us.HeightFrom, d.height) and ISNULL(us.HeightTo, d.Height) 
     AND up.Age between ISNULL(us.AgeFrom, up.age) and ISNULL(us.AgeTo, up.Age) 
     AND up.Gender = ISNULL(us.Gender, up.Gender) 
     WHERE up.id = @UserId2 
     ORDER BY up.id ASC 
    END 
    ELSE 
    BEGIN 
     return 1 
    END 

Но как уже упоминалось, я получаю следующее сообщение об ошибке Неправильный синтаксис около если

+0

только для уточнения - некоторые записи имеют UserID в нуль, а некоторые не имеют его период? – ElenaDBA

+0

@ElenaDBA Пользователи имеют возможность добавить запись в таблицу настроек, если они это сделают, тогда UserId будет связан с пользователем, который вставил запись, и я сравню UserId1 с UserId2 и вернулю значение true, иначе возвратите 1 по умолчанию если никакой записи не существует для UserId1 –

+0

Мне не известно об ограничении использования IF в UDF. Пожалуйста, разместите весь код функции create/alter. Возможно, синтаксическая ошибка прямо перед IF. Или возможно это потому, что у вас есть RETURN в вашем предложении ELSE, но не в вашем предложении IF. –

ответ

0

Так выглядит например, пользователь не был введен в userettings, идентификатор всегда будет нулевым, но если пользователь был введен, то идентификатор никогда не будет нулевым, поэтому просто попробуйте это:

SELECT TOP 1 
CASE WHEN us.UserId IS NULL THEN 1 ELSE @UserID2 END AS does_data_match 
FROM [User].[User_Profile] up 
INNER JOIN [User].[User_Details] d ON up.Id = d.UserId 
LEFT OUTER JOIN [user].[User_Settings] us ON up.ID=us.UserID 
WHERE up.ID = @UserId1 
AND d.Height between ISNULL(us.HeightFrom, d.height) and ISNULL(us.HeightTo, d.Height) 
AND up.Age between ISNULL(us.AgeFrom, up.age) and ISNULL(us.AgeTo, up.Age) 
AND up.Gender = ISNULL(us.Gender, up.Gender) 
ORDER BY up.id ASC 
+0

User_Profile нравится up.Id = us.UserId Я только что пробовал ваш ответ, и он возвращает null –

+0

Я думаю, что получаю то, что вы пытаетесь сделать. Попробуйте мое обновление – ElenaDBA

+0

Я добавил обновление к вопросу, показывая свою ситуацию, когда добавляю оператор If вокруг инструкции cas –

2

Сначала используйте условие IF, чтобы проверить, существует ли @ UserId1 в таблице настроек. ЕСЛИ НЕ, верните требуемое значение. Если запись существует, проверьте, совпадают ли оба идентификатора и возвращают требуемое значение.

Это должно быть простым и простым в обращении.

ALTER FUNCTION [dbo].[CheckFunction] 
(
-- Add the parameters for the function here 
@UserID1 int 
) 
RETURNS BIT 
AS 
BEGIN 

DECLARE @ReturnCode BIT 

IF (@UserID1 = 1) 
BEGIN 
SET @ReturnCode = 1 
END 
ELSE 
BEGIN 
SET @ReturnCode = 0 
END 

RETURN @ReturnCode 
END 

GO 

Выполнение функции:

SELECT [dbo].[CheckFunction] (0) --returns 0 (expected) 

SELECT [dbo].[CheckFunction] (1) --returns 1 (expected) 
+0

Я пробовал выработать инструкцию case, но это не позволяет мне иметь оператор if, обернутый вокруг него. –

+0

Я имею в виду использование CASE только в том случае, если у вас есть записи в таблице настроек. Если @ UserId1 не существует в настройках, вам вообще не нужно выполнять SQL. –

+0

Это скалярная функция, она выполняется в запросе, и я передаю UserId1 и UserId2, а внутри этой скалярной функции я пытался записать оператор if, чтобы проверить, существует ли UserId1 в таблице параметров, если это происходит, тогда я выполняю case case, иначе возвратите 1 по умолчанию. Но скалярная функция не позволяет мне иметь внутри оператора if. –

Смежные вопросы