2013-09-25 5 views
0

ОБНОВЛЕНИЕ: Нам было сообщено, что возможно, что значения для обоих параметров не будут предоставлены. В таком случае не должно быть фильтра как для мобильного телефона, так и для адреса электронной почты.SQL: Условие, в котором условие не работает

Мне сложно определить, что не так с моим запросом. В принципе, у меня есть две переменные

@EmlAdd 
@MblNum 

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

что происходит с моим решением до сих пор является то, что: , если значения для 2-х переменных поставлялись: эТО РАБОТАЕТ если только одна из переменных имеет значение: НЕ РАБОТАЕТ

DECLARE 
@EmlAdd AS VARCHAR(100), 
@MblNum AS VARCHAR(100) 

SET @EmlAdd = '' 
SET @MblNum = '5555555' 

SELECT 
    USER_ID, 
CONTACT_VALUE 
FROM 
TBL_CONTACTS 
WHERE 
(
    (CONTACT_VALUE = @MblNum OR @MblNum = '') 
     OR 
    (CONTACT_VALUE = @EmlAdd OR @EmlAdd = '') 
) 

Любая помощь будет принята с благодарностью.

+0

вы пробовали какой-либо из ответа дали ??Я думаю, что есть 2 ответа, которые я думаю правильно – Dhaval

+0

Да, с небольшим количеством настроек, решение @ devart работало. –

ответ

1

Попробуйте один -

DECLARE 
     @EmlAdd VARCHAR(100) 
    , @MblNum VARCHAR(100) 

SELECT 
     @EmlAdd = '' 
    , @MblNum = '5555555' 

SELECT [USER_ID], CONTACT_VALUE 
FROM dbo.TBL_CONTACTS 
WHERE CONTACT_VALUE IN (@MblNum, @EmlAdd) 
0

Что вы говорите, если MblNum пуст или если EmlAdd пуст, возвратите все.

Возможно, вы захотите изменить средний ИЛИ на И.

WHERE 
(
    (CONTACT_VALUE = @MblNum OR @MblNum = '') 
     AND 
    (CONTACT_VALUE = @EmlAdd OR @EmlAdd = '') 
) 

этак MblNum должен соответствовать CONTACT_VALUE, а также EmlAdd должны соответствовать или быть пустым, и наоборот. Теперь, если вы включите оба параметра, они оба должны совпадать для и. Если вы все еще хотите, либо один, чтобы соответствовать затем опустить чек на пустой параметр,

WHERE CONTACT_VALUE = @MblNum OR CONTACT_VALUE = @EmlAdd 

Если какой-либо параметр пуст, не должен соответствовать CONTACT_VALUE и будут игнорироваться.

+0

Contact_Value - это столбец, который будет содержать как адрес электронной почты, так и номер мобильного телефона. Использование AND не будет возвращать какое-либо значение, если бы были указаны как адрес электронной почты, так и номер мобильного телефона. –

+0

@ AgentX44 Я не был уверен, что это был тот же самый столбец или нет. Если бы это было так, второе решение будет работать, если они будут отличаться, первый столбец будет работать. – Vulcronos

0

Удалите ИЛИ @MblNum = «» и ИЛИ @EmlAdd = «»

Когда только один параметр имеет значение, установленное другой будет равняться «» (0 длина строки) и, следовательно, логическое условие будет выполнено для каждого вызова.

DECLARE 
@EmlAdd AS VARCHAR(100), 
@MblNum AS VARCHAR(100) 

SET @EmlAdd = '' 
SET @MblNum = '5555555' 

SELECT 
    USER_ID, 
CONTACT_VALUE 
FROM 
TBL_CONTACTS 
WHERE 
(
    (CONTACT_VALUE = @MblNum) 
     OR 
    (CONTACT_VALUE = @EmlAdd) 
     OR 
    (@EmlAdd='' AND @MblNum='') 
) 
+0

Я не получил эту часть: SET EmlAdd = 'OR MblNum =' ' SET MblNum =' 5555555 ' –

+0

typo извините, я исправился – Steveo

0

у почти там, замените «» в нуль является

DECLARE @SAMPLE TABLE 
(
[USER_ID] INT IDENTITY(1,1), 
[CONTACT_VALUE] NVARCHAR(255) 
) 

INSERT INTO @SAMPLE 
VALUES 
('5555555'), 
('[email protected]') 

DECLARE 
@EmlAdd AS VARCHAR(100), 
@MblNum AS VARCHAR(100) 

SET @EmlAdd = '' 
SET @MblNum = '5555555' 

SELECT 
USER_ID, 
CONTACT_VALUE 
FROM 
@SAMPLE 
WHERE 

--the изменения здесь, замените «» на нулевой, так как это является стандартной практикой запрос, развеселить =)

(@EmlAdd is null or CONTACT_VALUE [email protected]) 
or 
(@MblNum is null or CONTACT_VALUE = @MblNum) 
+1

Это не сработает, потому что если EmlAdd равно null, запрос будет соответствовать каждой строке. – Vulcronos

+0

oops, моя ошибка, спасибо –

0

Поскольку вы ищете только один столбец данных, вам не обязательно быть таким умным ... если вы не пренебрегаете предоставлением другой соответствующей информации.

DECLARE @EmlAdd As varchar(100) 
     , @MblNum As varchar(100); 

SET @EmlAdd = ''; 
SET @MblNum = '5555555'; 

/* Optional (recommended) 
-- Set values to NULL if blank string is passed 
SET @EmlAdd = NullIf(@EmlAdd, ''); 
SET @MblNum = NullIf(@MblNum, ''); 
*/ 

-- If both variables are NULL then no search criteria 
IF Coalesce(@EmlAdd, @MblNum) IS NULL THEN 
    BEGIN 
    SELECT USER_ID 
     , CONTACT_VALUE 
    FROM TBL_CONTACTS; 
    END 
-- At least one variable is not NULL so let's look for it 
ELSE 
    BEGIN 
    SELECT USER_ID 
     , CONTACT_VALUE 
    FROM TBL_CONTACTS 
    WHERE CONTACT_VALUE IN (@EmlAdd, @MblNum); 
    END 
; 
+0

Я смог использовать ваше решение, а также решение @ devart, но то, что он предоставил, было проще. –

0
DECLARE 
@EmlAdd AS VARCHAR(100), 
@MblNum AS VARCHAR(100) 

SET @EmlAdd = '' 
SET @MblNum = '5555555' 

SELECT USER_ID, CONTACT_VALUE 
FROM 
TBL_CONTACTS 
WHERE 
(
    (CONTACT_VALUE = case when @MblNum = '' then @EmlAdd else case when @EmlAdd = '' then @MblNum end end) 

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