Как в 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 >>К недостаткам этого решения я отнес невозможность использования индексов движком каше при оптимизации запроса.
Комментариев нет:
Отправить комментарий