sqlite元组比较
发布时间:2020-12-12 18:57:24 所属栏目:百科 来源:网络整理
导读:尝试做与 this question相同的事情,但这次是在sqlite中.在我当前的应用程序中,我需要能够执行此类查询: SELECT First,Last,ScoreFROM mytableWHERE ('John','Jordan',5) = (First,Score ) AND (First,Score) = ('Mike','Taylor',50) ORDER BY First,ScoreLI
尝试做与
this question相同的事情,但这次是在sqlite中.在我当前的应用程序中,我需要能够执行此类查询:
SELECT First,Last,Score FROM mytable WHERE ('John','Jordan',5) <= (First,Score ) AND (First,Score) <= ('Mike','Taylor',50) ORDER BY First,Score LIMIT 1 得到这些数据,得到(‘Liz’,’Jordan’,2)的答案: +-------+---------+-------+ | First | Last | Score | +-------+---------+-------+ | Liz | Jordan | 2 | | John | Jordan | 2 | | Liz | Lemon | 10 | | Mike | Taylor | 100 | | John | Jackson | 1000 | | Mike | Wayne | 1 | | Liz | Lemon | 20 | | Liz | Meyers | 5 | | Bruce | Jackson | 1 | +-------+---------+-------+ 在sqlite中实现这一目标的最有效方法是什么?请记住,这是一个玩具示例,我的实际应用程序具有包含更多列和数据类型以及数亿行的表. 如果解决方案可以轻松扩展到更多/更少的列,那就更好了. 元组比较: 元组按字典顺序排序,这意味着序列的排序与它们的第一个不同元素的顺序相同.例如,(1,2,x)< (1,y)返回与x<相同的值.年. 值得注意的是SQL-92(以及mysql,oracle,postresql)正确实现了这一点.该标准使用“行值构造函数”来表示我称之为元组的内容.该行为在part 8.2.7,page 209中以极其详细的方式定义. 这是创建示例所必需的SQL: create table mytable ( First char(20),Last char(20),Score int ); insert into mytable values ('Liz',2); insert into mytable values ('John',2); insert into mytable values ('Liz','Lemon',10); insert into mytable values ('Mike',100); insert into mytable values ('John','Jackson',1000); insert into mytable values ('Mike','Wayne',1); insert into mytable values ('Liz',20); insert into mytable values ('Liz','Meyers',5); insert into mytable values ('Bruce',1); create unique index 'UNIQ' on mytable (First,Score); 解决方法SQLite不支持元组比较.但是行构造函数是一种简写.您可以使用更复杂的WHERE子句获得相同的结果.我省略了LIMIT 1子句,以便更容易看到两个查询都返回相同的集合. (在支持行构造函数的平台上,即.)这种比较 ROW(a,b) <= ROW(c,d) 相当于 a < c OR (a = c AND b <= d) 您可以根据需要将其扩展到尽可能多的列. SELECT First,Score FROM mytable WHERE (('John' < First) OR ('John' = First AND 'Jordan' < Last) OR ('John' = First AND 'Jordan' = Last AND 5 <= Score)) AND ((First < 'Mike') OR (First = 'Mike' AND Last < 'Taylor') OR (First = 'Mike' AND Last = 'Taylor' AND Score <= 50)) ORDER BY First,Score Liz Jordan 2 Liz Lemon 10 Liz Lemon 20 Liz Meyers 5 我没有用数据中的NULL来测试它. 截至2018年,SQLite确实支持元组比较. OP的查询使用提供的SQL语句生成预期输出.这种编写查询的方式也有效. (我发现……和…之间更具可读性.) SELECT First,Score FROM mytable WHERE (First,Score ) between ('John',5) and ('Mike',Score Limit 1 我不知道这是多久以前介绍的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |