我将一个zipcodes列表传递给存储过程(例如11111,11112,11111,11111,11151),邮政编码表只包含几行(比如11111,11112,11131),现在我想写一个返回表中不存在的邮政编码的查询(11114和11115)
有人可以帮我写这样的查询吗?
提前致谢。
答案 0 :(得分:2)
不知道您的确切实现,这个快速而肮脏的查询应该适应您正在尝试的内容。从您输入的列表中选择不在邮政编码完整表格中的邮政编码:
SELECT ZipCode
FROM PassedList
WHERE ZipCode NOT IN (
SELECT DISTINCT ZipCode
FROM ZipCodeTable
)
答案 1 :(得分:0)
您使用JOIN
来构建第一个查询。
现在你需要一个RIGHT JOIN / WHERE来包含你的邮政编码列表中的所有项目,邮政编码上的对应记录是null
编辑:以下是一个示例
CREATE TABLE ZipCodesTable(Code int NOT NULL)
CREATE TABLE ZipCodesList (Code int NOT NULL)
INSERT INTO ZipCodesTable (Code) VALUES (11111)
INSERT INTO ZipCodesTable (Code) VALUES (11112)
INSERT INTO ZipCodesTable (Code) VALUES (11113)
INSERT INTO ZipCodesList (Code) VALUES (11111)
INSERT INTO ZipCodesList (Code) VALUES (11112)
INSERT INTO ZipCodesList (Code) VALUES (11113)
INSERT INTO ZipCodesList (Code) VALUES (11114)
INSERT INTO ZipCodesList (Code) VALUES (11115)
SELECT ZipCodesList.Code
FROM ZipCodesTable RIGHT
JOIN ZipCodesList
ON ZipCodesTable.Code = ZipCodesList.Code
WHERE ZipCodesTable.Code IS NULL
答案 2 :(得分:0)
本文使用CTE获取您的条目字符串,转换为表格,以便您可以在查询中包含:http://www.sqlservercentral.com/articles/CTE/67974/
答案 3 :(得分:0)
无需在SQL中创建表,在存储过程中使用临时表。如果你需要传递拉链作为字符串使用它。如果你有一个表值参数,你可以将它们作为表传递。
CREATE PROCEDURE spCheckZip
@Zips varchar(256) --space delimited list of zips
AS
IF OBJECT_ID('tempdb..#ZipCheck') IS NOT NULL
DROP TABLE #ZipCheck
CREATE TABLE #ZipCheck (zipcode string) --Note string not int for zips with leading 0's.
IF CharIndex(' ',@Zips) > 1
BEGIN
Declare @StartPos as int
Declare @ZipCd As Varchar(16)
set @StartPos = 2
set @ZipCd = substring(@Zips,1,CharIndex(',',@Zips))
WHILE @StartPos > 1 and @StartPos < Len(@Zips)
BEGIN
INSERT Into #ZipCheck (zipcode)
SELECT Substring(@ZipCd,1,len(@ZipCd)-1)
SET @StartPos = charindex(',',@Zips, @StartPos)+1
SET @ZipCd = substring(@Zips,@StartPos,CharIndex(',',@Zips))
END
END
SELECT ZipCode
FROM ZipCheck LEFT JOIN YourZipTable on ZipCheck.zipcode=YourZipTable.YourZipField
WHERE YourZipTable.YourZipField IS NULL