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