SQL IN语句创建排除查询

时间:2011-08-01 20:01:58

标签: sql

我上周在SO上问过这个问题 -

SQL Exclusion Query

看起来我的标准已经改变,所以我将使用我当前的信息重新填写:

是否可以在单个SQL语句中执行以下操作:

在IN语句中使用电话号码的子集,例如IN(8001231000,8001231001,8001231002)。然后查询我的数据库中有电话号码,并返回我的IN语句的原始子集中的哪些电话号码不在我的数据库中?我的数据库是Oracle 10g。

基本上我没有带回哪个电话号码IN(8001231000,8001231001,8001231002),而是想知道我的数据库中没有哪个电话号码IN(8001231000,8001231001,8001231002)

我想我需要创建一个类似于上一个问题的答案的临时表:

SELECT level - 1 + 8001231000
   FROM dual
CONNECT BY level <= 8001239999-8001231000+1

但是我不需要做一系列数字,而是需要执行一个可以使用IN语句构建的查询。用户将直接在IN语句中输入他们的电话号码列表,而不是选择静态的号码范围。

我如何在单个语句中构建它,以便我可以加入并从此列表中排除我的数据库结果,这样它只会返回我的数据库中找不到的电话号码?我可以在列表而不是范围上进行LEVEL CONNECT BY吗?

5 个答案:

答案 0 :(得分:1)

听起来你可以使用NOT IN执行此操作并将值或其他表作为操作数

答案 1 :(得分:1)

我给你原来的问题this answer,如果你有一个任意的数字列表而不是一个范围,这似乎更合适。这是我的答案:

我会加载一个包含您要检查的所有电话号码的临时表,并进行排除加入:

SELECT a.phone_number
FROM phone_numbers_i_want_to_check AS a
LEFT OUTER JOIN phone_numbers AS b
  ON a.phone_number = b.phone_number
WHERE b.phone_number IS NULL;

答案 2 :(得分:0)

在我看来,你想要一个包含你要比较的电话号码列表的新表。

然后你可以执行IN和NOT IN查询,从这个表中选择SELECT来获得匹配的集合,以及不匹配的集合。

尝试使用硬编码的IN字符串将是相同的,但更多的是键入 - 例如NOT IN版本将重复。

答案 3 :(得分:0)

如果我理解了这个问题,你想对数组本身做一个SELECT(所以不能直接使用IN或NOT IN)。

不确定你有什么方言,但这是一个TSQL方法:

  1. 使用函数
  2. 将数组转换为表
  3. 使用功能
  4. 选择

    功能:

    CREATE Function [dbo].[ParseIntList]  (@intArray nvarchar(4000) )  
    Returns @tbl_int Table  (ParsedInteger Int)  As  
    
    BEGIN 
    
    DECLARE @end Int,
            @start Int
    
    SET @intArray =  @intArray + ',' 
    SET @start=1
    SET @end=1
    
    WHILE @end<Len(@intArray)
        BEGIN
            SET @end = CharIndex(',', @intArray, @end)
            INSERT INTO @tbl_int 
                SELECT
                    Cast(Substring(@intArray, @start, @end-@start) As Int)
    
            SET @start=@end+1
            SET @end = @end+1
        END
    
    RETURN
    END
    

    SELECT:

    Declare @intArray = varchar(max)
    SET @intArray= '8001231000,8001231001,8001231002'
    
    SELECT CAST(1 as varchar(1)) + CAST(ParsedInteger as varchar(10)) 
    FROM (Select ParsedInteger From dbo.ParseIntList(@intArray)) a 
    WHERE ParsedInteger NOT IN (Select PhoneNumber FROM myOtherDatabaseTable)
    

答案 4 :(得分:0)

这将生成一个表(用IN语句替换&amp; x),可以查询。

SELECT *
  FROM (SELECT regexp_substr(&x, '[^,]+', 1, LEVEL) phone_number
           FROM dual
         CONNECT BY LEVEL <= length(&x) - length(REPLACE(&x, ',', '')) + 1)
 WHERE phone_number NOT IN (SELECT phone_table.phone_number 
                              FROM phone_table)