Hi,

Good catch, in previous `without null any/all`, any stands for
`and`(your choice 1); all stands for `or`(your choice 2);

I think in our having clause, we can keep consistent with where
clause. In our where clause, if you write select s1 from root.sg.*
where s1 > 1, we will write it as select s1 from root.sg.* where
root.sg.d1.s1 > 1 and root.sg.d2.s1 > 1 which is your choice 1.

If user really want to use `or`, he can also write sql completely like
SELECT count(s1) from root.sg.* group by([1, 10), 2ms) having
count(root.sg.d1.s1) !=NULL OR count(root.sg.d2.s1) != NULL



Best,
--------------------
Yuan Tian

On Wed, Jun 29, 2022 at 2:39 PM Eric Pai <[email protected]> wrote:
>
> This is really a good feature!
>
> Unlike relational database query, the 'column' name in IoTDB is a string 
> concatenated by the prefix path in FROM clause and the suffix path in SELECT 
> clause. In some cases maybe there are more than 1 output columns. If so, does 
> one simple HAVING clause still work and bring no ambiguity?
>
> E.g. what's the result in the following query statement?
> SELECT count(s1) from root.sg.* group by([1, 10), 2ms) having count(s1) is 
> not null.
> If there're two timeseries root.sg.d1.s1 and root.sg.d2.s1, then the result 
> set will contain 2 data columns count(root.sg.d1.s1) and 
> count(root.sg.d2.s1). So what does 'count(s1) is not null' mean?
> - Choice1: count(root.sg.d1.s1) !=NULL AND count(root.sg.d2.s1) != NULL
> - Choice2: count(root.sg.d1.s1) !=NULL OR count(root.sg.d2.s1) != NULL
> - Choice3: A SQL query error is returned. Any wildcard query with HAVING 
> clause causing ambiguity is forbidden.
>
> 在 2022/6/29 14:20,“[email protected]”<[email protected]> 写入:
>
>     Hello everyone,
>
>     We want to support having clause in IoTDB.
>
>     1.Background
>     Replace grammar ‘without null any/all()’ to help users easier to 
> understand and use.
>
>     2.Specification
>     2.1Current query grammar
>     selectStatement
>         : TRACING? selectClause intoClause? fromClause whereClause? 
> specialClause?
>         ;
>     whereClause
>         : WHERE expression
>         ;
>     expression
>         : LR_BRACKET unaryInBracket=expression RR_BRACKET
>         | constant
>         | time=(TIME | TIMESTAMP)
>         | fullPathInExpression
>         | functionName LR_BRACKET expression (COMMA expression)* RR_BRACKET
>         | (PLUS | MINUS | OPERATOR_NOT) 
> expressionAfterUnaryOperator=expression
>         | leftExpression=expression (STAR | DIV | MOD) 
> rightExpression=expression
>         | leftExpression=expression (PLUS | MINUS) rightExpression=expression
>         | leftExpression=expression (OPERATOR_GT | OPERATOR_GTE | OPERATOR_LT 
> | OPERATOR_LTE | OPERATOR_SEQ | OPERATOR_DEQ | OPERATOR_NEQ) 
> rightExpression=expression
>         | unaryBeforeRegularOrLikeExpression=expression (REGEXP | LIKE) 
> STRING_LITERAL
>         | unaryBeforeIsNullExpression=expression OPERATOR_IS OPERATOR_NOT? 
> NULL_LITERAL
>         | unaryBeforeInExpression=expression OPERATOR_NOT? (OPERATOR_IN | 
> OPERATOR_CONTAINS) LR_BRACKET constant (COMMA constant)* RR_BRACKET
>         | leftExpression=expression OPERATOR_AND rightExpression=expression
>         | leftExpression=expression OPERATOR_OR rightExpression=expression
>         ;
>      ‘where s1 is not null’ can only filter raw data, so it can be a 
> replacement for 'without null' for raw data;
>     But we also need a replacement for ‘without null’ for data after ‘group 
> by’, so we want to support ‘having’ clause.
>
>     2.2Having clause grammar
>     selectStatement
>         : TRACING? selectClause intoClause? fromClause whereClause? 
> specialClause?
>         ;
>         : specialLimit #specialLimitStatement
>         | orderByTimeClause specialLimit? #orderByTimeStatement
>         | groupByTimeClause orderByTimeClause? specialLimit? 
> #groupByTimeStatement
>         | groupByFillClause orderByTimeClause? specialLimit? 
> #groupByFillStatement
>         | groupByLevelClause orderByTimeClause? specialLimit? 
> #groupByLevelStatement
>         | fillClause orderByTimeClause? specialLimit? #fillStatement
>         ;
>
>     specialLimit
>         : limitClause slimitClause? alignByDeviceClauseOrDisableAlign? 
> #limitStatement
>         | slimitClause limitClause? alignByDeviceClauseOrDisableAlign? 
> #slimitStatement
>         | withoutNullClause limitClause? slimitClause? 
> alignByDeviceClauseOrDisableAlign? #withoutNullStatement
>         | havingClause? #havingStatement
>         | alignByDeviceClauseOrDisableAlign 
> #alignByDeviceClauseOrDisableAlignStatement
>         ;
>
>     havingClause
>         : HAVING expression;
>     The previous example can be resolved using the following sql:
>     select count(s1) from root.sg.d group by([1, 10), 2ms) having count(s1) 
> is not null
>     3.Restriction
>     Having clause must be used with group by together and predicate 
> expression must be related to some aggregation result instead of raw data, 
> otherwise we will throw exception in anaylizing stage. (For example, we use 
> ‘having count(s1) is not null’  instead of ’having s1 is not null' in 
> previous sql example)
>
>
>     Thanks,
>     —————————————————
>     Weihao Li
>     Timecho
>
>
>

Reply via email to