SQL 'in' clause
Скажите мне такую вещь: список значений в in выражении в SQL можно вообще передать параметром, хоть в какой-нибудь СУБД?
В Firebird нельзя, ну я как-то не интересовался, как оно в других СУБД, использовал временную табличку и подзапрос с where exists (select 1 from TmpTbl ...) но что-то вот сегодня пришло в голову - а почему собственно нельзя?
В Firebird нельзя, ну я как-то не интересовался, как оно в других СУБД, использовал временную табличку и подзапрос с where exists (select 1 from TmpTbl ...) но что-то вот сегодня пришло в голову - а почему собственно нельзя?
no subject
(no subject)
no subject
select * from user_table1 where id in (select * from table(:my_collection))
table(:my_collection) -- это оператор, который коллекцию приводит к таблице
(no subject)
(no subject)
(no subject)
(no subject)
no subject
no subject
(no subject)
no subject
(no subject)
no subject
раскрывается как
c1 = a1 or c1 = a2 or ...
Можно сделать так
c1 = ANY(array)
что в принципе равносильно предыдущей записи с отличием, что в ANY можно передавать списки, массивы.
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
противогаз покусал?
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
$stmt->execute(array("male", "female", "transgender", "developer"));
Увы, да(
no subject
Запрос: select * from data.street where id_street in (select unnest(?)) где ? является параметром
Сам код:
PreparedStatement selectPs = connection.prepareStatement("select * from data.street where id_street in (select unnest(?))");
Integer[] a = new Integer[]{927,929,930,931,932,933,934,935,936,937};
Array a2 = connection.createArrayOf("int",a);
selectPs.setArray(1,a2);
Используется именно Integer, а не int, потому что требуется ссылочный тип. Значение параметра устанавливается по индексу, потому что это голый JDBC.
Функция unnest разворачивает массив в набор строк (http://www.postgresql.org/docs/9.3/static/functions-array.html)
no subject
no subject
Кажется, ещё на ib.demo.ru я возмущался, что нелья делать группировку как и ордер бай - по номерам полей, и они это сделали.
no subject
no subject
CREATE TYPE [dbo].[IdsTableType] AS TABLE (
[Id] INT NULL);
В дот.нете все работает через SqlMetaData и SqlDataRecord, в общем в итоге можно in засунуть в переменную собственного типа.
Только один забавный глюк - т.к. sql сервер строит планы запросов по имени переменных, то внезапно когда в in 2 значения и 10.000 значений - планы одинаковые.
Бороли это буквально таким кодом
var parameterName = name + GetRangePostfix(records.Count);
который по логарифму делает параметру разные имена :)
no subject
В качеестве параметра передавать array
no subject
(no subject)
no subject
В MSSQL у решения есть очевидный недостаток: отсутствие статистики, т.е. в зависимости от объёма данных для "IN" может потребоваться подсказка "INNER MERGE JOIN". По умолчанию явно будет LOOP JOIN.
no subject