sqlite3中的奇怪查询分组

时间:2017-02-17 18:30:29

标签: sql sqlite

我有一张这样的表:

CREATE TABLE prices2
(  
   id_price     integer primary key,
   date        text, 
   value       real
);

让我说我有这个价值观:

insert into prices2( '01/01/2017', 1 ); 
insert into prices2( '02/01/2017', 2 ); 
insert into prices2( '02/01/2017', 3 ); 
insert into prices2( '04/01/2017', 7 ); 
insert into prices2( '04/01/2017', 6 ); 

我想知道为什么这个选择是正确的并返回一些结果,以及返回的内容:

select date, 
       count(*)  
  from prices2
 where date 
 group by date like '%/01/2017';

也许“date like”%/ 01/2017“是一个布尔表达式,它返回某种值???

1 个答案:

答案 0 :(得分:1)

date like '%/01/2017'确实是一个布尔表达式;在SQLite中,它返回01

> select date, date like '%/01/2017' from prices2;
01/01/2017|1
02/01/2017|1
02/01/2017|1
04/01/2017|1
04/01/2017|1

因此,当您在GROUP BY子句中使用此表达式时,您将获得一个1个值组,以及一个用于0NULL值的组(但没有这个例子)。

至于where datedocumentation说:

  

SQL语言具有多个上下文,其中计算表达式并将结果转换为布尔值(true或false)。这些背景是:

     
      
  • SELECT,UPDATE或DELETE语句的WHERE子句,
  •   
  • [...]
  •   
     

要将SQL表达式的结果转换为布尔值,SQLite首先将结果以与CAST表达式相同的方式将结果转换为NUMERIC值。数字零值(整数值0或实际值0.0)被认为是假的。 NULL值仍为NULL。所有其他值都被认为是真实的。

date值以非零的数字开头,因此它们被解释为true。