Select 当过滤列之一可能不存在时

Select when one of filter-column may not exists

假设一种情况,不知道过滤列是否存在。

t:([]a:`s1`s2`s3; c:1 2 3);
select c from t where null t[`a]
select c from t where null t[`b]
'length
(where null t[`a])~where null t[`b]
1b

如果第 a 列存在,那么 select 就可以了。

但是,当我对 b 列(不存在)使用过滤器时,出现错误。

  1. 为什么会这样? - 我检查了两个 where 结果 - 它们是相同的
  2. 如何解决这种情况?

在 QSQL 中 'where' 需要作用于长度与 table 或计数 1 相同的布尔值列表。您的示例的计数为零

q)t[`b]
`symbol$()
q)count t`b
0

一些例子:

q)select from t where 0b
a c
---
q)select from t where 00b
'length
  [0]  select from t where 00b
       ^
q)select from t where 000b
a c
---
q)select from t where 0000b
'length
  [0]  select from t where 0000b
       ^
q)select from t where 0#0b
'length
  [0]  select from t where 0#0b

更新: 因为您提到了 'where' 的结果,其中包含在 QSQL 格式中,而不是独立执行然后应用结果,所以您会看到以下差异

q)where 00b
`long$()
q)select from t where 00b
'length
  [0]  select from t where 00b
       ^
q)select from t `long$()
a c
---

您可以使用 @ 运算符来捕获错误,例如

q)@[{select c from t where null t[x]};`b;{x}]
"length"
q)@[{select c from t where null t[x]};`a;{x}]
c
-

虽然您不需要像这样引用列,但如果您想动态地 select 列,您可以使用函数 select,因此函数形式的等效查询将是

q)?[`t;enlist(null;`a);0b;(enlist `c)!(enlist `c)]
c
-

这里的语法非常棘手,但是 parse 关键字对于确定您应该使用的参数非常有用,例如

q)parse"select c from t where null a"
?
`t
,,(^:;`a)
0b
(,`c)!,`c

显示您需要的参数。错误捕获和函数查询的组合应该可以帮助您实现您在这里想要实现的目标。