2016-10-23 53 views
0

SQLite可以使用IN运算符检查集覆盖范围吗?sqlite IN检查集覆盖范围

(SELECT n from nums where n < 4) IN (1,2,3,4) (其中NUMS是一套全数字)将返回true

我已经搜索了文件,但只能找到他们仅使用上的IN左侧的一个值的文档。 测试已返回它可以,但我需要确认这是一个有效的用例,而不是像SQLite返回聚合查询没有适当的GROUP BY语句的能力的副作用。

+0

究竟你的意思为“它可以”?您所显示的表达式在任何版本的SQLite中都是无效的。 –

+0

**否**。只有一个*单值*被检查为一个集合。 I.e .:'2 IN(1,2,3,4)'将返回true。 –

+0

@CL如果你运行一个这样的子查询,其中num是一个整数的表格(从n中选择n,n <3)IN(1,2,3,4)它将返回true。但是,如果你运行(从n中选择n,n <4)IN(1,2,4)它将返回false,这是预期的行为。道歉,我想念输入的问题。 – cujo

回答

0

documentation说:

中,而不是在运营商采取单一的标量操作数左侧

所以,如果你在左侧使用子查询,将其视为scalar subquery,其行为不符合您的要求:

表达式的结果是SELECT语句返回的第一行中唯一列的值。如果SELECT产生多于一个结果行,则忽略第一个之后的所有行。

要检查组与覆盖,你必须检查是否有在左集合中的任何元素,是不是在正确的设置:

WITH a(n) AS (
    SELECT n 
    FROM nums 
    WHERE n < 4 
), 
b(n) AS (
    VALUES (1), (2), (3), (4) 
) 
SELECT * 
FROM a 
WHERE NOT EXISTS (SELECT 1 
        FROM b 
        WHERE b.n = a.n); 
1

文档说没有。

IN和NOT IN运算符在左边使用单标量操作数,右边的矢量操作数由零个或多个标量的明确列表或由单个子查询形成。

重点煤矿

https://www.sqlite.org/lang_expr.html#in_op