SQL-соединение в списке параметров или ноль - PullRequest
1 голос
/ 18 февраля 2012

Я пишу хранимую процедуру для выбора адресов. Существует много параметров выбора, но проблема заключается в выборе состояний. Страна является обязательной и может иметь одно или несколько названий стран. Если страна - США, то штат может быть НЕДЕЙСТВИТЕЛЕН или один или много кодов штатов. У меня есть табличная функция (ParmTable_String), поэтому я могу присоединиться к спискам параметров, и это работает при наличии кодов состояния:

DECLARE @Country AS varchar(MAX);
DECLARE @State AS varchar(256);
SET @Country = 'USA';
SET @State = 'ME, VT';
SELECT *
FROM Customer
JOIN ParmTable_String(@Country, ',') AS CT
ON Country = CT.str
JOIN ParmTable_String(@State, ',') AS ST
ON State = ST.str

но если @State = null, я получаю нулевой набор результатов. Если я сделаю это левое соединение и добавлю предложение where, оно будет работать для одного кода состояния или нуля, но не для списка.

WHERE State = @State OR @State IS NULL

У кого-нибудь есть решение этой проблемы?

Хорошо, у меня есть решение, но я думаю, что есть лучший способ, так как мне это кажется немного грубым:

DECLARE @Country AS varchar(MAX);
DECLARE @State AS varchar(256);
SET @Country = 'USA';
SET @State = 'ME, VT';
SELECT *
FROM Customer
JOIN ParmTable_String(@Country, ',') AS CT
ON Country = CT.str
WHERE (State IN 
(SELECT str from lntw.ParmTable_String(@State, ',')) OR @State IS NULL)

Ответы [ 4 ]

0 голосов
/ 19 февраля 2012

как насчет

ОБЪЯВИТЬ @Country AS varchar (MAX);
ОБЪЯВИТЬ @State AS varchar (256);
SET @Country = 'USA';
SET @State = 'ME, VT';
ВЫБРАТЬ *
ОТ клиента
JOIN ParmTable_String (@Country, ',') AS CT
ON Страна = CT.str
LEFT JOIN ParmTable_String (isNULL (@State, ''), ',') AS ST
ON State = ST.str

0 голосов
/ 18 февраля 2012

NULLIF (ST.str, '') вернет ноль, если ST.str - пустая строка. Затем вы пытаетесь сделать на State = NULL, который не будет возвращать запись.

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

DECLARE @Country AS varchar(MAX);
DECLARE @State AS varchar(256);
SET @Country = 'USA';
SET @State = 'ME, VT';

SELECT *
FROM Customer
    JOIN ParmTable_String(@Country, ',') AS CT
        ON Country = CT.str
    JOIN ParmTable_String(isnull(@State,''), ',') AS ST
        ON (State = ST.str or State is null)
0 голосов
/ 18 февраля 2012

У вас есть ИЛИ ... почему бы не попробовать вместо этого два запроса:

IF @State is null
BEGIN
  SELECT * FROM Customer
  JOIN ParmTable_String(@Country, ',') AS CT
  ON Country = CT.str
END
ELSE
BEGIN
  SELECT * FROM Customer
  JOIN ParmTable_String(@Country, ',') AS CT
  ON Country = CT.str
  JOIN ParmTable_String(@State, ',') AS ST
  ON State = ST.str 
END
0 голосов
/ 18 февраля 2012

Я не знаком с сервером sql, но мне интересно, может ли что-то подобное сработать

State = NULLIF(@State,State)

** Я предполагаю, что NULLIF является чем-то эквивалентным функции оракула nvl ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...