2012-01-10 3 views
2

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

ВЫБРАТЬ идентификатор из пользователей, где ...

1 
2 
6 
8 
9 

и Я и массив со значениями 2,3,6

Как я могу проверить в SQL, что массив является подмножеством результата запроса?

+0

возможно duplicate [SQL Выбрать все строки, в которых существует подмножество] (http://stackoverflow.com/questions/8425232/sql-select-all-rows-where-subset-exists) – onedaywhen

ответ

2

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

То есть, я хотел бы сделать это:

SELECT u.id 
FROM Users U 
    RIGHT JOIN Numbers N 
     ON U.id=N.Number 
WHERE N.Number IN (2,3,6) 

Это основной запрос; точные данные зависят от того, что вы будете делать, чтобы обнаружить сбой. Любые записи, где u.ID IS NULL указывают, что это не подмножество. Если вы на самом деле не сразу хотите набор идентификаторов вы можете изменить его

SELECT COUNT(*) AS Missing 
FROM Users U 
    RIGHT JOIN Numbers N 
     ON U.id=N.Number 
WHERE N.Number IN (2,3,6) 
AND u.id IS NULL 

и всякий раз, когда Потерялись был> 0 вы бы знали, что вы не имеете подмножество. (В SQL Server, по крайней мере, вы можете отбросить int до значения 0 = false,! 0 = true, если это удобнее для вашего приложения.)

Другие подробности, которые мы можем добавить с дополнительной информацией о том, что вы на самом деле пытаетесь это сделать, но, надеюсь, это имеет смысл в качестве базовой техники.

(NB все это предполагает, что у вас есть номера/таблицы индикаторную в вашей базе данных. Они невероятно полезны, так, если вы еще не сделали, я бы получить один настроить.)

1

Использование Dynamic SQL:

declare @cmd varchar(200) 
select @cmd = "select id from Users WHERE id in (" + @array + ")" 

exec(@cmd) 
+0

Нет, не предложение 'IN', ваш запрос делает другой путь, делая выбранные идентификаторы из пределов массива. –

+0

Вы хотите проверить, все ли 2,3,6 присутствуют в таблице? Или что они присутствуют в этом порядке? Что именно? –

+0

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

2

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

Если JOIN имеет тот же размер, что и массив, массив является подмножеством таблицы.

Вот пример, который принимает ваш массив в в таблице ...

SELECT 
    COUNT(*) 
FROM 
    Users 
INNER JOIN 
    search 
    ON search.id = Users.id 
HAVING 
    COUNT(*) = (SELECT COUNT(*) FROM search) 
1

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

Select count(*) 
From 
    (
     Select id 
     From users 
     Intersect 
     Select id 
     From testValues 
    ) test 

Если счетчик равен количеству значений, которые вы тестируете, тогда массив формирует подмножество.

+0

Конечно, это предполагает, что вы используете вариант SQL с пересечением. Решение Dems должно работать повсюду. –

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