尝试同样的问题,但在SQLite。在我的应用程序中,我需要做这种类型的查询:
SELECT First, Last, Score
FROM mytable
WHERE
('John', 'Jordan', 5) <= (First, Last, Score )
AND (First, Last, Score) <= ('Mike', 'Taylor', 50)
ORDER BY First, Last, Score
LIMIT 1
并得到答案('Liz', 'Jordan', 2)
,给定此数据:
SQLite不支持元组比较。但是行构造函数是一种简写。使用更复杂的WHERE子句也可以得到相同的结果。我省略了LIMIT 1
子句,以便更容易看到两个查询返回相同的集合。(也就是说,在支持行构造函数的平台上)
ROW(a,b) <= ROW(c,d)
等价于
a < c OR (a = c AND b <= d)
您可以根据需要将其扩展到任意多列。
SELECT First, Last, 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, Last, Score
Liz Jordan 2
Liz Lemon 10
Liz Lemon 20
Liz Meyers 5
我没有在数据中使用null进行测试。
截至2018年,SQLite 支持元组比较。OP的查询使用提供的SQL语句产生预期的输出。这种编写查询的方式也是有效的。(我发现between ... and ...
更可读)
SELECT First, Last, Score
FROM mytable
WHERE (First, Last, Score ) between ('John', 'Jordan', 5) and ('Mike', 'Taylor', 50)
ORDER BY First, Last, Score
Limit 1
我不知道这是多久以前引入的
我一直在通过使用字符串连接(||
)和字符序列来避免缺乏元组比较,以确保字段不会"合并"并导致不正确的匹配(-
)。
(First, Last, Score) <= ('Mike', 'Taylor', 50)
是
First||' - '||Last||' - '||Score <= 'Mike'||' - '||'Taylor'||' - '||'50'
或
First||' - '||Last||' - '||Score <= 'Mike - Taylor - 50'
所以你的SELECT
应该是
SELECT First, Last, Score
FROM mytable
WHERE
'John - Jordan - 5' <= First||' - '||Last||' - '||Score
AND First||' - '||Last||' - '||Score <= 'Mike - Taylor - 50'
ORDER BY First, Last, Score
LIMIT 1
字符串连接是非常昂贵和不简洁的,但它的工作方式相同,看起来非常相似。
Sqlite's Raw value
add in 3.15.0
: https://sqlite.org/rowvalue.html