2016-01-07 2 views
2

У меня есть запрос, который получает адрес для лица, подавшего жалобу. У человека может быть несколько адресов. Раньше мы просто выбрать адрес типа «ИЛИ», что делает для чистого подзапроса ...Подбор подбора с условиями

(SELECT TOP 1 Address 
FROM Address WHERE NameID = PersNameID AND AddressTypeCode = 'OR') AS ComplainantAddress 

Теперь, как адреса введены, они могут или не может иметь адрес типа «ИЛИ ». Они могут иметь только адрес типа «ML» или типа «BU» и «ML».

Мне нужно получить первый адрес, который заполняется для человека, глядя в определенном порядке (по типу). Я могу сделать огромный оператор CASE, но это лучший способ? Или я должен перейти на JOIN с ORDER By и взять первое непустое значение?

Ищет предложения.

ответ

6

Вам не обязательно использовать CASE, но вам нужно сделать что-то подобное. Вот трюк, с помощью CHARINDEX():

(SELECT TOP 1 Address 
FROM Address 
WHERE NameID = PersNameID 
ORDER BY CHARINDEX(AddressTypeCode, 'OR,ML,BU') 
) 

Если у вас есть дополнительные коды, и не хотят их, а затем:

(SELECT TOP 1 Address 
FROM Address 
WHERE NameID = PersNameID 
ORDER BY (CASE WHEN AddressTypeCode IN ('OR', 'ML', 'BU') 
       THEN 1 ELSE 2 
      END), 
      CHARINDEX(AddressTypeCode, 'OR,ML,BU') 
) 

EDIT:

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

(SELECT TOP 1 Address 
FROM Address LEFT OUTER JOIN 
     (VALUES ('OR', 1), ('ML', 2), ('BU', 3) 
    ) codes(code, priority) 
     ON Address.AddressTypeCode = codes.code 
WHERE NameID = PersNameID 
ORDER BY COALESCE(codes.priority, 999999) 
) 

Это больше SQL-Server'ish. Строковая манипуляция - это то, что работает (с изменениями имени функции) практически в любой базе данных.

+0

Да, это выглядит намного чище, чем сазе я в главной роли в десятки кодов типа. До сих пор похоже, что это сработает. –

2

Если у вас будет приоритет для ваших адресов, я бы предложил захватить это в базе данных. Таким образом, при условии, что ваш AddressTypes таблица имеет ComplaintPriority колонку, вы могли бы сделать это:

SELECT TOP 1 
    A.Address 
FROM 
    Address A 
INNER JOIN AddressTypes T ON T.AddressTypeCode = A.AddressTypeCode 
WHERE 
    A.NameID = PersNameID -- Not sure where this is coming from 
ORDER BY 
    T.ComplaintPriority 
+0

Если я пишу приложение, это то, что я обычно делаю, просто добавьте столбец сортировки. Но это стороннее приложение, и я должен запустить запрос для отчета SSRS. –

+0

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

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