提问人:mmv456 提问时间:10/19/2023 更新时间:10/20/2023 访问量:121
kdb/q 如何在函数中使用条件句 (if/else)
kdb/q How to use conditionals (if/else) in a function
问:
我正在尝试了解如何根据表的当前状态更改表中的值。 目前,isSelected 列是 0 或 1,我想将其值更改为另一个,但我不知道如何在 kdb/q 中做到这一点。
这是我尝试在 psuedocode 中做的事情:
fChangeBit[table]:
if table[rowToFlip][isSelected] == 0:
set table[rowToFlip][isSelected] = 1;
else if table[rowToFlip][isSelected] == 1:
set table[rowToFlip][isSelected] = 0;
return table;
有什么方法可以在 q 中执行 if/else if/else 吗?
答:
1赞
Jamie
10/19/2023
#1
您可以使用向量条件运算符:https://code.kx.com/q/ref/vector-conditional/。
这可以在 qSQL 查询中使用,因此它看起来像:
update a:?[a=1;0;1] from table
其中是您要翻转值的列,如果要就地执行更新,只需向表 IE 'table 添加前导反引号即可。a
您可能还想查看 https://code.kx.com/q/ref/cond/ 以获取更多信息。
评论
0赞
mmv456
10/19/2023
谢谢,这很有帮助,但看起来它编辑了表格中的那一行,我如何将其保存到表格中?
0赞
Jamie
10/19/2023
请注意,如果您担心此行包含任何非 0/1(或者可能与安全性无关),那么它看起来会保留任何非 0/1 原样。update a:?[a=0;1;?[a=1;0;a]] from tab
0赞
mmv456
10/19/2023
好吧,这是有道理的。如何对表中的单行进行编辑?例如,也许是我需要翻转的第 5 行,我可以使用该脚本更新整个表以包含更改后的第 5 行吗?
0赞
Jamie
10/19/2023
在 update 语句中对表名使用前导反引号(如“table”)将就地更新表,即将其保存到表中
0赞
mmv456
10/19/2023
对不起,我是 q 的菜鸟,但鉴于上面的代码(),我该在哪里说是这一行来更改状态,仅此而已?update a:?[a=0;1;?[a=1;0;a]] from "table
2赞
scottstein37
10/19/2023
#2
您可以使用 ?向量条件运算符:https://code.kx.com/q/ref/vector-conditional/
q) t: ([]id:til 10; isSelected: 0 1 0 1 0 1 0 1 0 1)
q) show t
id isSelected
-------------
0 0
1 1
2 0
3 1
4 0
5 1
6 0
7 1
8 0
q)show update isSelected:?[isSelected=1; 0; 1] from t
id isSelected
-------------
0 1
1 0
2 1
3 0
4 1
5 0
6 1
7 0
8 1
9 0
在这种情况下,您只是翻转 0 和 1,您还可以使用 not 运算符:
q)show update not isSelected from t
id isSelected
-------------
0 1
1 0
2 1
3 0
4 1
5 0
6 1
7 0
8 1
9 0
评论
0赞
terrylynch
10/19/2023
是的,我认为这里的简单使用是更清洁的解决方案not
评论