我有一个名为“海拔”的表,其中包含以下列:
使用以下语法时,出现“行值被滥用”错误。
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运算符不能用于夫妻?
答案 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)
感谢Shawn和C 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;