我上周在SO上问过这个问题 -
看起来我的标准已经改变,所以我将使用我当前的信息重新填写:
是否可以在单个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吗?
答案 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方法:
功能:
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)