value
будет искать переменную в глобальной области видимости, поэтому вы получаете ошибку. Вы можете напрямую использовать локальные переменные, как вы делаете это в вашей функции.
Ваша функция в основном правильная, просто требуется небольшая коррекция, чтобы добавить условие (я упоминал об этом ниже). Однако лучшим подходом было бы использовать функциональный выбор в этом случае.
Использование функционального выбора :
q) t:([]id:`a`b; val:3 4)
q) gd: {?[`t;enlist (=;`val;y);0b;((),x)!(),x]}
q) gd[`id;3] / for single column
Выход:
id
-
1
q) gd[`id`val;3] / for multiple columns
Если ваш столбец условий имеет символ типа, введите значение условия, например:
q) gd: {?[`t;enlist (=;`id;y);0b;((),x)!(),x]}
q) gd[`id;enlist `a]
Вы можете использовать parse
, чтобы получить функциональную форму qsql
запросов:
q) parse " select id,val from t where id=`a"
?
`t
,,(=;`id;,`a)
0b
`id`val!`id`val
Использование String concat (ваша функция):
q)getData:{[requiredColumns;condition] value "select ",(", " sv string[requiredColumns])," from t where id=", .Q.s1 condition}
q) getData[enlist `id;`a] / for single column
q) getData[`id`val;`a] / for multi columns