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
раскрывается как
c1 = a1 or c1 = a2 or ...
Можно сделать так
c1 = ANY(array)
что в принципе равносильно предыдущей записи с отличием, что в ANY можно передавать списки, массивы.
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
Вы просто так хуйню пишете от жары али заказал такое кто?
no subject
no subject
no subject
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
IN (a1, a2, ...)
no subject
в примере таки sql, но использующий коллецию pl/sql
no subject
no subject
В качеестве параметра передавать array
no subject
no subject
Теперь знаю хоть одну точную, достоверную деталь — противогаз не кусается.
no subject
no subject
no subject
no subject
В T-SQL чуть ли не в MSDN пишут об эквивалентности запросов.
В PostgreSQL - точно не помню, но в плане выполнения тоже хэши видел, однако думаю, что конструкции эквивалентны.
А когда `IN (SQL statement)` встречается, то тут тот же принцип с той разницей, что в памяти надо хранить результат его выполнения. И PostgreSQL, и Oracle могут оказаться чувствительны к нему, если он достаточно велик, а в памяти они ограничены.
no subject
Интеллигентные люди используют эвфемизм who knew.
no subject
no subject
no subject
ты зря отмалчиваешься.
no subject
no subject
no subject
На него нашло что-то русское.
no subject
no subject
no subject
В MSSQL у решения есть очевидный недостаток: отсутствие статистики, т.е. в зависимости от объёма данных для "IN" может потребоваться подсказка "INNER MERGE JOIN". По умолчанию явно будет LOOP JOIN.
no subject