2016-10-23 48 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