SQL: использовать несколько значений в одном операторе SELECT - PullRequest
7 голосов
/ 23 июня 2009

Я использую инструкцию SELECT в T-SQL для таблицы, подобной этой:

SELECT DISTINCT name, location_id, application_id FROM apps
WHERE ((application_id is null) or (application_id = '4'))
AND ((location_id is null) or (location_id = '3'))

Кажется, это работает нормально при поиске одного application_id или location_id, но что, если я хочу запустить оператор для нескольких местоположений? Я хочу вернуть все результаты для неизвестного количества location_id и application_id. Например, если я хочу найти кого-то по адресу location_id 2, 3, 4, 5, но только с одним application_id. Как бы я это сделал?

Заранее спасибо!


РЕДАКТИРОВАТЬ: Я идиот! Я сделал так, чтобы это звучало легко, не давая вам всех подробностей. Все эти значения даны из таблицы. Пользователь должен будет выбрать идентификаторы из столбца в таблице, а не вставлять их. После небольшого исследования этой проблемы, я нашел страницу , которая, казалось, давала жизнеспособное решение.

CREATE FUNCTION iter$simple_intlist_to_tbl (@list nvarchar(MAX))
   RETURNS @tbl TABLE (number int NOT NULL) AS
BEGIN
   DECLARE @pos        int,
           @nextpos    int,
           @valuelen   int

   SELECT @pos = 0, @nextpos = 1

   WHILE @nextpos > 0
   BEGIN
      SELECT @nextpos = charindex(',', @list, @pos + 1)
      SELECT @valuelen = CASE WHEN @nextpos > 0
                              THEN @nextpos
                              ELSE len(@list) + 1
                         END - @pos - 1
      INSERT @tbl (number)
         VALUES (convert(int, substring(@list, @pos + 1, @valuelen)))
      SELECT @pos = @nextpos
   END
  RETURN
END

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


РЕДАКТИРОВАТЬ 2: После небольшого прочтения этой темы мне кажется, что для этого мне нужна хранимая процедура. Кажется, мне нужен код вверху, но у меня проблемы с адаптацией к моим потребностям. Структура таблицы следующая:

application_id   name                  location_id
------------------------------------------------------
1                Joe Blogs             34
2                John Smith            55

Согласно статье, на которую я только что ссылался:

"Правильный способ обращения с Ситуация заключается в использовании функции, которая распаковывает строку в таблицу. Вот очень простая такая функция: "

Итак, мне кажется, что мне нужно распаковать эти значения в строку и передать их с помощью этой хранимой процедуры. Любая идея о том, как я могу заставить это работать?

РЕДАКТИРОВАТЬ 3: Мне удалось решить это с помощью charindex () и convert (), в то время как я установил их сверху. Спасибо за вашу помощь, и я снова прошу прощения за боль.

Ответы [ 3 ]

17 голосов
/ 23 июня 2009

Используйте IN следующим образом:

location_id IN ('2', '3', '4', '5')
3 голосов
/ 23 июня 2009

Я не уверен, правильно ли я понял часть вашего вопроса " EDIT ", но вы имеете в виду что-то подобное?

SELECT DISTINCT name, location_id, application_id 
FROM apps
WHERE location_id IN 
(
    SELECT id FROM other_table
)

EDIT:
Теперь, когда я прочитал ваше второе редактирование, я все еще не уверен, понимаю ли я, что вы ДЕЙСТВИТЕЛЬНО хотите сделать.

Конечно, мы можем помочь вам с вашей хранимой процедурой, но есть одна вещь, которая мне не совсем понятна:

Вы хотите, чтобы мы помогли вам создать SP?
Или вы действительно хотите сделать что-то еще, но думаете, что вы должны сделать это, создав SP, потому что ссылка так сказала?

Можете ли вы указать, как будет выглядеть ожидаемый результат?

0 голосов
/ 23 июня 2009

Вы можете использовать предложение IN следующим образом: -

SELECT DISTINCT name, location_id, application_id FROM apps
WHERE ((application_id is null) or (application_id = '4'))
AND ((location_id is null) or (location_id in ('2', '3', '4', '5')))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...