kdb - 使用解析或值(KDB / Q)从字符串中访问本地范围的变量
问题描述
以下几行Q代码都抛出错误,因为解析“local”语句时,局部变量不在正确的范围内。
{local:1; value "local"}[]
{[local]; value "local"}[1]
{local:1; eval parse "local"}[]
{[local]; eval parse "local"}[1]
有没有办法从解析的字符串内部访问局部变量?
注意:这是我正在努力解决的实际问题的简化,即编写一个执行查询的函数,接受它应该返回的列列表。我想象成品看起来像这样:
getData:{[requiredColumns, condition]
value "select ",(", " sv string[requiredColumns])," from myTable where someCol=condition"
}
此查询中的condition
参数是无法识别的参数,我确实意识到我可以附加它的值而不是在字符串中引用它,但是真正的查询使用了很多局部变量,包括表等,所以它不像刚才那样简单在调用value
它之前将所有变量从字符串中拉出。
我是 KDB 和 Q 的新手,所以如果有人有更好的方法来达到同样的效果,我很高兴接受关于在 Q 中实现这一结果的正确方法的教育。仍然有兴趣了解变量访问的事情虽然是可能的。
解决方案
在第一个示例中,您是对的,local 不在正确的范围内,因为 value 正在寻找全局变量 local。
解决此问题的一种方法是使用命名空间,它将全局定义变量,但只能通过调用该命名空间来访问。在下面的修改示例中,我在.ns
命名空间中定义了本地
{.ns.local:1; value ".ns.local"}[]
对于您在选择时面临的问题,如果requiredColumns
是列的符号列表,您可以使用 take 运算符#
来选择它们。
getData:{[requiredColumns] requiredColumns#myTable}
对于使用变量的更高级查询,您可能必须使用功能选择表单,在此处解释。这将允许您在 select 语句的 where 和 by 子句中包含变量
函数形式的相同示例是(没有 by 子句,只有 select 和 where):
getData:{[requiredColumns;condition] requiredColumns:(), requiredColumns;
?[myTable;enlist (=;`someCol;condition);0b;requiredColumns!requiredColumns]}
requiredColumns
即使用户输入单个列名,第一行也确保它是一个列表
推荐阅读
- python - 如何在atom中创建python-django项目
- c++ - 在没有用户输入的情况下从 C++ 调用 gnu plot
- python - Telegram TypeError:第一个参数必须是可调用的
- api - 使用 curl 从 opendatacommunities.org 获取数据
- r - Reshaping a data.frame with tidyr
- ios - How can I get last object in CollectionView willDisplayCell?
- elasticsearch - 如何提高建议者的结果,但不使用弹性搜索过滤?
- git - Different default remote for pull and push, while allowing manually specifying one
- mysql - MySQL:如何在数据库上创建触发器以进行跟踪
- android - 如何在android studio中添加通知声音