У меня есть следующая скалярная функция, эта функция сравнивает значения между одним пользователем и другим, если они совпадают, и возвращает 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
Но как уже упоминалось, я получаю следующее сообщение об ошибке Неправильный синтаксис около если
только для уточнения - некоторые записи имеют UserID в нуль, а некоторые не имеют его период? – ElenaDBA
@ElenaDBA Пользователи имеют возможность добавить запись в таблицу настроек, если они это сделают, тогда UserId будет связан с пользователем, который вставил запись, и я сравню UserId1 с UserId2 и вернулю значение true, иначе возвратите 1 по умолчанию если никакой записи не существует для UserId1 –
Мне не известно об ограничении использования IF в UDF. Пожалуйста, разместите весь код функции create/alter. Возможно, синтаксическая ошибка прямо перед IF. Или возможно это потому, что у вас есть RETURN в вашем предложении ELSE, но не в вашем предложении IF. –