如何进行元组比较



尝试同样的问题,但在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),给定此数据:

<表类>首先去年得分tbody> <<tr> Liz td> 2 约翰约旦2 Liz td> 10道明> tr>迈克泰勒 100 约翰杰克逊 1000 迈克韦恩 1道明> tr> Liz td> 20道明> tr> Liz td> 5道明> tr>布鲁斯杰克逊 1道明> body>

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

相关内容

  • 没有找到相关文章

最新更新