是否可以在SQLite中将IN运算符用于夫妇

时间:2019-07-05 17:55:03

标签: sqlite

我有一个名为“海拔”的表,其中包含以下列:

  • lat:双(键)
  • long:双(键)
  • 值:double

使用以下语法时,出现“行值被滥用”错误。

SELECT *
FROM elevation
WHERE (lat, long) IN ((29.42682, 81.774118), (29.63561, 81.622355))

此语法有效:

SELECT *
FROM elevation
WHERE (lat, long) = (29.42682, 81.774118) OR (lat, long) = (29.63561, 81.622355)

这是否意味着IN运算符不能用于夫妻?

3 个答案:

答案 0 :(得分:2)

如果只有几个坐标,则可以直接将它们与IN一起使用,而不是使用临时表(但是,如果有很多坐标,则该方法尤其适用于表上的索引)。你是如此,与你的尝试如此接近:

SELECT *
FROM elevation
WHERE (lat, long) IN (VALUES (29.42682, 81.774118), (29.63561, 81.622355));

答案 1 :(得分:1)

IN运算符可用于左侧的一对。更一般地,左侧可以是具有多列的行值。参见https://www.sqlite.org/rowvalue.html

输入重复的OR语句列表的一种替代方法是创建一个临时表,其中包含可以在子查询表达式中“查询”的文字值列表。也可以将索引添加到临时表中,以提高效率。

CREATE TEMP TABLE IF NOT EXISTS coordinates (lat, long, UNIQUE (lat, long));
INSERT OR IGNORE INTO coordinates VALUES (29.42682, 81.774118), (29.63561, 81.622355);
SELECT *
FROM elevation
WHERE (lat, long) IN coordinates;

请注意较短的引用,因为临时表包含相同数量的字段。可以使用更冗长的WHERE (lat, long) IN (SELECT * FROM coordinates),但这在这里不是必需的。

答案 2 :(得分:0)

感谢ShawnC Perkins。我将在这里总结您的答案(如果我做错了,请告诉我)。

所以有两种方法可以做到这一点。

“优雅的方式”(Shawn's answer):
它使用VALUES关键字。

SELECT *
FROM elevation
WHERE (lat, long) IN (VALUES (29.42682, 81.774118), (29.63561, 81.622355));

优化的方法(C Perkins's answer)在需要查询大量数据的情况下非常有用:
它使用一个临时表。

CREATE TEMP TABLE IF NOT EXISTS coordinates (lat, long);
DELETE FROM coordinates;
INSERT INTO coordinates VALUES (29.42682, 81.774118), (29.63561, 81.622355);
SELECT *
FROM elevation
WHERE (lat, long) IN coordinates;