понедельник, 11 апреля 2016 г.

Cache': Как параметризовать select from in?

Как в cache sql передать через параметр несколько значений в выражение in?
SQL опция запроса IN означает проверить, присутствует ли некоторое значение среди перечисленных в списке. Например:
select ID from table where color in ('red','blue')
В общем и целом, движок sql использует опцию in для фильтрации выборки и, во внутреннем плане выполнения, может применить, как действительно фильтр, так и использовать индексы. К сожалению, в cache нельзя передать в in значения извне, если требуется передать несколько значений. Например
select ID from table where color in (:inparam)
и в строке передаваемой через параметр написать "red,blue".

То же самое, по поведению, можно сделать, если применить хранимую функцию, которую указать в условии выборки и передать параметр в нее:
ClassMethod In(ID As %Integer, Arg As %String)
  As %String [ SqlProc ]
{
 n i,q
 s q=0
 f i=1:1:$l(Arg,",") i $p(Arg,",",i)=ID s q=1 q
 q q
}
Здесь функция проверяет, присутствует ли значение ID в строке Arg в перечне значений, разделенных запятыми.

Эта хранимая процедура сама по себе не привязана ни к какой таблице, поэтому, чтобы не плодить лишних сущностей, я внес ее в класс Expand из заметки Cache': Как развернуть значение параметра в несколько строк. Для проверки работы использовал данные из этой же фиктивной таблицы:
>>select ID, Expand_Expand('a,b,c,d,e,f') from Expand 
where Expand_In(ID,"b,c")=1
(1)>>go
b
c
>>
К недостаткам этого решения я отнес невозможность использования индексов движком каше при оптимизации запроса.

Комментариев нет:

Отправить комментарий