条件运算函数
概述
以下条件函数接受一个输入序列或两个(则,否则)序列以及一个布尔序列条件。结果序列的类型相同,但 seq_filter_pos() 函数返回的类型为 uint4 的结果序列。
两个输入序列迭代器参数必须是相同的类型,结果是一个值序列或一个标量值。如果两个输入序列参数的长度不同,则操作仅在两个序列中较短的那个序列的元素数量范围内执行。
函数 | 说明 |
---|---|
seq_iif( 条件, 然后, 否则 ) | 根据 条件 序列中元素的布尔值选择 然后 序列或 否则 序列中的元素。三个序列以相同的速度遍历(如果使用 然后 序列中的元素,则跳过 否则 序列中的元素,反之亦然)。(更多详情请参阅三元运算符页面。) |
seq_if( 条件, 然后, 否则 ) | 根据 条件 序列中元素的布尔值选择 然后 序列或 否则 序列中的元素。与 seq_iif() 不同,未使用的序列位置不会改变。(更多详情请参阅三元运算符页面。) |
seq_filter( 条件, 输入 ) | 选择 输入 序列中 条件 序列中布尔值为真的元素。 |
seq_filter_pos( 条件 ) | 获取序列 条件 中值为 true 的元素的位置。 |
Iff 和 If 函数
seq_iif()
和 seq_if()
函数返回一个值序列,该序列代表 If-Then-Else 条件的结果。当序列 1 中的布尔值为真时,从序列 2 中选择一个元素;为假时从序列 3 中选择。然而,序列 2 和 3 中的位置推进方式不同。对于 seq_iif()
,两个序列的位置都推进到与序列 1 中的位置相对应;而对于 seq_if()
,只有“被选中”的序列的位置推进。
以下是一个示例脚本,演示了 seq_iif() 和 seq_if() 函数:
INSERT INTO SimpleSequence(testNumber,bVal1,iVal2,iVal3)
VALUES(1,'{0,1,0,0,1}','{-1,-2,-3,-4,-5}','{1,2,3,4,5}');
SELECT bVal1,iVal2,iVal3,seq_iif(bVal1,iVal2,iVal3) AS "iif" FROM SimpleSequence
WHERE testNumber=1;
SELECT bVal1,iVal2,iVal3,seq_if(bVal1,iVal2,iVal3) AS "if" FROM SimpleSequence
WHERE testNumber=1;
bVal1{}
iVal2{}
iVal3{}
iif{}
-------------------------------------------------------------------------
{0, 1, 0, 0, 1}
{-1, -2, -3, -4, -5}
{1, 2, 3, 4, 5}
{1, -2, 3, 4, -5}
bVal1{}
iVal2{}
iVal3{}
if{}
-------------------------------------------------------------------------
{0, 1, 0, 0, 1}
{-1, -2, -3, -4, -5}
{1, 2, 3, 4, 5}
{1, -1, 2, 3, -2}
对于上述数据集,seq_iif() 的结果序列如以下表格所示:
seq1 | seq2 | seq3 | iif |
---|---|---|---|
0 | -1 | 1 | 1 |
1 | -2 | 2 | -2 |
0 | -3 | 3 | 3 |
0 | -4 | 4 | 4 |
1 | -5 | 5 | -5 |
seq_if()
:
seq1 | seq2 | seq3 | if |
---|---|---|---|
0 | -1 | 1 | 1 |
1 | -2 | 2 | -1 |
0 | -3 | 3 | 2 |
0 | -4 | 4 | 3 |
1 | -5 | 5 | -2 |
要使用 xSQL 演示此选择语句,可从 samples/xsql/scripts/financial 目录中运行以下命令来执行示例脚本:
f 4
filter函数
seq_filter()
函数的第一个参数为布尔类型,返回序列的类型与第二个参数相同。结果序列仅包含序列 2 中对应序列 1 中元素为真的那些元素。seq_filter_pos()
函数返回输入序列中为真的元素的位置。 以下是一个演示这些函数的示例脚本:
INSERT INTO SimpleSequence(testNumber,bVal1,iVal1)
VALUES(1,'{0,1,0,1}','{42,-13,27,19}');
SELECT bVal1, iVal1, seq_filter(bVal1,iVal1) AS "filter",
bVal1, seq_filter_pos(bVal1) AS "filter_pos"
FROM SimpleSequence WHERE testNumber = 1;
bVal1{}
iVal1{}
filter{}
-------------------------------------------------
{0, 1, 0, 1}
{42, -13, 27, 19}
{-13, 19}
bVal1{}
filter_pos{}
-------------------------------------------------
{0, 1, 0, 1}
{1, 3}
在上述示例中,布尔序列在位置 1 和 3 处的值为“true”。因此,输入值序列中相应位置的值 -13 和 -19 被复制到结果序列中。
要使用 xSQL 演示此选择语句,可从 samples/xsql/scripts/financial 目录中运行以下命令来执行示例脚本:
f 5
示例
以下是一个展示折叠功能的示例代码片段:
-- seq_wsum, seq_wavg
INSERT INTO SimpleSequence(testNumber,dVal1,dVal2)
VALUES(5,'{2,3,4}','{1,2,4}');
SELECT dVal1,dVal2,seq_wsum(dVal1,dVal2) AS "wsum" FROM SimpleSequence WHERE testNumber=5;
SELECT dVal1,dVal2,seq_wavg(dVal1,dVal2) AS "wavg" FROM SimpleSequence WHERE testNumber=5;
dVal1{}
dVal2{}
wsum
-------------------------------------------------------------------------
{2.000000, 3.000000, 4.000000}
{1.000000, 2.000000, 4.000000}
24.000000
dVal1{}
dVal2{}
wavg
-------------------------------------------------------------------------
{2.000000, 3.000000, 4.000000}
{1.000000, 2.000000, 4.000000}
2.666667
-- seq_cov, seq_corr
INSERT INTO SimpleSequence(testNumber,dVal1,dVal2)
VALUES(6,'{2,3,5,7}','{3,3,5,9}');
SELECT dVal1,dVal2,seq_cov(dVal1,dVal2) AS "cov" FROM SimpleSequence WHERE testNumber=6;
SELECT dVal1,dVal2,seq_corr(dVal1,dVal2) AS "corr" FROM SimpleSequence WHERE testNumber=6;
dVal1{}
dVal2{}
cov
------------------------------------------------------------------------------
{2.000000, 3.000000, 5.000000, 7.000000}
{3.000000, 3.000000, 5.000000, 9.000000}
4.500000
dVal1{}
dVal2{}
corr
------------------------------------------------------------------------------
{2.000000, 3.000000, 5.000000, 7.000000}
{3.000000, 3.000000, 5.000000, 9.000000}
0.956689