2013-10-08 3 views
4

У меня есть две объединенные таблицы. Таблица 1 содержит данные клиента, а таблица 2 имеет свой статус.Таблица SQL Join с подстановочными переменными

Мне нужно найти подстановочный знак, но я хочу, чтобы он возвращал результаты на основе состояния из таблицы 2. Это работает, когда я фактически ввожу некоторые данные в переменную @ClientName, но когда он оставлен пустым, он возвращает все записывает и игнорирует переменную @ClientStatus. Есть какие нибудь идеи как это починить?

DECLARE @ClientName NVARCHAR (100) = '' 
DECLARE @ClientStatus INT = 1 

SELECT DBO.CLIENTS.CLIENTID, 
     DBO.CLIENTS.FIRST_NAME, 
     DBO.CLIENTS.LAST_NAME, 
     DBO.CLIENTS.PHONE_NUMBER, 
     DBO.CLIENTS.MOBILE_NUMBER, 
     DBO.CLIENTS.HOUSE_ADDRESS_NUMBER, 
     DBO.CLIENTS.STREET_NAME, 
     DBO.CLIENTS.TOWN_CITY, 
     DBO.CLIENTS.POST_CODE, 
     DBO.CLIENTS.EMAIL_ADDRESS, 
     DBO.CLIENTS.CLIENT_SOURCE, 
     DBO.CLIENTS.CLIENT_STATUS, 
     DBO.CLIENTS.DATE_ADDED, 
     DBO.CLIENTS.CALL_DATE, 
     DBO.CLIENTS.CALL_TIME, 
     DBO.CLIENT_STATUS.CLINIC_STATUS 
FROM DBO.CLIENTS 
     INNER JOIN DBO.CLIENT_STATUS 
       ON DBO.CLIENTS.CLIENT_STATUS = DBO.CLIENT_STATUS.STATUSID 
WHERE (DBO.CLIENT_STATUS.CLINIC_STATUS = @ClientStatus) 
     AND (DBO.CLIENTS.LAST_NAME LIKE @ClientName + '%') 
     OR (DBO.CLIENTS.MOBILE_NUMBER LIKE @ClientName + '%') 

ответ

0

Прежде всего, я собираюсь предположить, что вы на самом деле хотите, чтобы сгруппировать ваши OR состояние, так как он имеет более высокий приоритет, чем AND

AND ((DBO.CLIENTS.LAST_NAME LIKE @ClientName + '%') 
    OR (DBO.CLIENTS.MOBILE_NUMBER LIKE @ClientName + '%')) 

что еще более важно, это не обращая внимания на переменную. Когда вы ничего не поставить для @ClientName конечное состояние становится

(DBO.CLIENTS.LAST_NAME LIKE '%') 
    OR (DBO.CLIENTS.MOBILE_NUMBER LIKE '%') 

Поскольку % является подстановочные, вы хотите сказать, что в соответствии с чем угодно. Чтобы обойти это, вы либо захотите, чтобы имя было передано, либо каким-то образом обработало NULL/пустой ввод.

0

Или имеет более высокий приоритет, чем оператор и, таким образом изменить свой запрос к следующему:

WHERE (DBO.CLIENT_STATUS.CLINIC_STATUS = @ClientStatus) 
     AND ((DBO.CLIENTS.LAST_NAME LIKE @ClientName + '%') 
     OR (DBO.CLIENTS.MOBILE_NUMBER LIKE @ClientName + '%')) 
+0

Это замечательно Ной - отлично работает – gillers322

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