2013-12-06 4 views
1

У меня есть SQL-запрос, в котором мне нужно условно добавить предложение «AND» в предложение WHERE У меня есть переменная (@Payment), которая требуется только в том, если он НЕ равен нулю. Я не должен использовать условие IF.Добавление условного предложения «И» в разделе Where

Вот мой код ..

SELECT Fname,lname,city, addressline1, state,zip 
FROM table1 
JOIN addresstable on table1.id = addresstable.addid 
WHERE state = @state 
AND ((@Payment IS NULL) OR (payment LIKE + '%' + @Payment + '%') OR (payment LIKE + '%all%')) 

В примере, если @Payment IS NULL, то я не хочу последний «И» пункт добавлен в ИНЕКЕ.

+0

Для каких технологий вы работаете и в какой базе данных sq используется u? –

+0

База данных сервера Sql – Henry

+0

и вы используете asp.net ?? –

ответ

1

Попробуйте это:

select fname,lname,city, addressline1, state,zip 
from table1 
join addresstable on table1.id = addresstable.addid 
where state = @state 
and (
     (@Payment is null) 
     or 
     (payment like @PaymentLike) 
) 

При вызове этого запроса. Вам нужны параметры прохождения 2.

  • @Payment
  • @PaymentLike

Предположим, вы передаете переменную 'Платеж' в @Payment

Вы проедете: (оплата == NULL)? «% всех%»: («%» + платеж + «%») до @PaymentLike

Уверен, что эта работа.

0

Вы не предоставляете никаких тестовых данных или вашей схемы, поэтому это довольно сложно сказать наверняка, но это может быть то, что вам нужно.

Я не уверен в цели этого условия OR (payment LIKE + '%all%'), он ограничит результаты для всех строк, содержащих слово «все».

Я предположил (хотя вы не указали это в своем вопросе), что вы пытаетесь вернуть все строки из addresstable и любых соответствующих строк из таблицы1. используя left join. Если это не так, вы можете переместить этот AND ((payment LIKE + '%' + COALESCE(@Payment,'') + '%') OR (payment LIKE + '%all%')) обратно в предложение WHERE и изменить LEFT JOIN на INNER JOIN.

--Test data 
DECLARE @table1 AS TABLE(addid INT, payment VARCHAR(20)) 
DECLARE @addresstable AS TABLE(addid INT, Fname VARCHAR(20),lname VARCHAR(20),city VARCHAR(20), addressline1 VARCHAR(20), [state] VARCHAR(20),zip VARCHAR(20)) 
DECLARE @Payment AS VARCHAR(20) 
DECLARE @state VARCHAR(20) 
SET @state='stateA' 
INSERT INTO @table1 (addid, payment) VALUES(1,'payment 1') 
INSERT INTO @table1 (addid, payment) VALUES(3,'payment 2') 
INSERT INTO @table1 (addid, payment) VALUES(4,'payment 3') 
INSERT INTO @table1 (addid, payment) VALUES(5,'payment 4') 

INSERT INTO @addresstable (addid, Fname, lname, city, addressline1, [state], zip) VALUES (1, 'A', 'A', 'A', 'A', 'stateA', 'A') 
INSERT INTO @addresstable (addid, Fname, lname, city, addressline1, [state], zip) VALUES (2, 'B', 'B', 'B', 'B', 'stateA', 'B') 
INSERT INTO @addresstable (addid, Fname, lname, city, addressline1, [state], zip) VALUES (3, 'C', 'C', 'C', 'C', 'stateA', 'C') 
INSERT INTO @addresstable (addid, Fname, lname, city, addressline1, [state], zip) VALUES (4, 'D', 'D', 'D', 'D', 'stateB', 'D') 
INSERT INTO @addresstable (addid, Fname, lname, city, addressline1, [state], zip) VALUES (5, 'E', 'E', 'E', 'E', 'stateB', 'E') 

--Query 
SELECT Fname,lname,city, addressline1, state,zip, payment 
FROM @addresstable a 
LEFT JOIN @table1 t 
    ON t.addid = a.addid 
    AND ((payment LIKE + '%' + COALESCE(@Payment,'') + '%') OR (payment LIKE + '%all%')) 
WHERE [state] = @state 
+0

Вы нашли ответы полезными? У вас есть вопросы? Не могли бы вы предоставить какие-либо данные испытаний? – Mack

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