首页 > 解决方案 > 使用解析或值(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 中实现这一结果的正确方法的教育。仍然有兴趣了解变量访问的事情虽然是可能的。

标签: kdb

解决方案


在第一个示例中,您是对的,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即使用户输入单个列名,第一行也确保它是一个列表


推荐阅读