metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2014-08-09 08:06 pm

SQL 'in' clause

Скажите мне такую вещь: список значений в in выражении в SQL можно вообще передать параметром, хоть в какой-нибудь СУБД?

В Firebird нельзя, ну я как-то не интересовался, как оно в других СУБД, использовал временную табличку и подзапрос с where exists (select 1 from TmpTbl ...) но что-то вот сегодня пришло в голову - а почему собственно нельзя?

[identity profile] swamp-agr.livejournal.com 2014-08-10 11:06 am (UTC)(link)
Как конкретно это делается через хэш?

[identity profile] anonim-legion.livejournal.com 2014-08-10 11:09 am (UTC)(link)
В СУБД - не знаю. В программе я бы построил по значениям в IN обычную хэш-таблицу, где ключом является хэш от значения, значением - само значение. Если хэш совпал, сравниваем напрямую, если сравнение успешно - значит, есть вхождение.

[identity profile] swamp-agr.livejournal.com 2014-08-10 12:42 pm (UTC)(link)
В Oracle, например, что в IN clause, что в нескольких OR, сравниваются хэши, если колонка проиндексирована. Там IN (a1, a2, ...) эквивалентен OR.

В T-SQL чуть ли не в MSDN пишут об эквивалентности запросов.

В PostgreSQL - точно не помню, но в плане выполнения тоже хэши видел, однако думаю, что конструкции эквивалентны.

А когда `IN (SQL statement)` встречается, то тут тот же принцип с той разницей, что в памяти надо хранить результат его выполнения. И PostgreSQL, и Oracle могут оказаться чувствительны к нему, если он достаточно велик, а в памяти они ограничены.