使用NOT IN对文本字符串的SELECT语句

时间:2013-10-04 14:00:38

标签: sql sql-server-2008

我想编写一个SELECT语句,该语句返回值但不包括文本列表中出现的任何内容

所以我有一个文本列表COL1, COl2, COL4, COL5(称为myString

我想说...

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'INTERFACE' AND COLUMN_NAME NOT IN(myString);

我该怎么做?

我试图在存储过程中解决这个问题,虽然回到基础知识会帮助我理解。我的SP代码看起来像这样......

INSERT INTO @excludeFieldTable VALUES ('CASENO'),('INTLINENO'),('INTMEMBNO'),('INTSTATUS'),('RECTYPE'),('EFFDTE'),('INTERR'),('INTERR2'),
('INTWARN'),('AUTHORISED'),('EXCLUDE'),('UPDATED'),('INTMEMBNO2'),('INTSTATUS2'),('ALTKEY');

    INSERT INTO @intColumnList SELECT DISTINCT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='INTERFACE' AND COLUMN_NAME NOT IN (SELECT DISTINCT(excludeFieldName) FROM @excludeFieldTable);

但针对NOT IN的{​​{1}}由于某种原因未进行评估(因此@excludeFieldTable仍然具有值'CASENO','INTLINENO'等)

4 个答案:

答案 0 :(得分:1)

您不能将单个逗号分隔的字符串放入IN子句中。使用EXEC

使用单独的值将它们动态组合在一起
exec('SELECT COLUMN_NAME 
      FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME=''INTERFACE'' 
      AND COLUMN_NAME NOT IN (' + @myString + ')')

答案 1 :(得分:1)

Exec('
SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME=''INTERFACE'' 
AND COLUMN_NAME NOT IN(' + @myString + ')')

另一个流行的选择是使用拆分功能然后加入它: 见这里:http://ole.michelsen.dk/blog/split-string-to-table-using-transact-sql/

答案 2 :(得分:1)

没有理由说你的方法不起作用。再次检查您的代码:

SQL Fiddle

MS SQL Server 2008架构设置

CREATE TABLE INTERFACE
    ([ID] int, 
     [COL1] varchar(2), 
     [COL2] varchar(2), 
     [COL3] varchar(2), 
     [COL4] varchar(2), 
     [CASENO] int,
     [INTLINENO] int,
     [INTMEMBNO] int,
     [INTSTATUS] int,
     [RECTYPE] varchar(2),
     [EFFDTE] date,
     [INTERR] int,
     [INTERR2] int,
     [INTWARN] int,
     [AUTHORISED] varchar(12),
     [EXCLUDE] varchar(10),
     [UPDATED] varchar(6),
     [INTMEMBNO2] int,
     [INTSTATUS2] int,
     [ALTKEY] varchar(12),
     [COL5] varchar(2))
;

查询1

DECLARE @excludeFieldTable TABLE
(
  excludeFieldName varchar(100)
)
INSERT INTO @excludeFieldTable VALUES 
('CASENO'),('INTLINENO'),('INTMEMBNO'),('INTSTATUS'),
('RECTYPE'),('EFFDTE'),('INTERR'),('INTERR2'),
('INTWARN'),('AUTHORISED'),('EXCLUDE'),('UPDATED'),
('INTMEMBNO2'),('INTSTATUS2'),('ALTKEY')


DECLARE @intColumnList TABLE
(
  columnList varchar(100)
)
INSERT INTO @intColumnList 
SELECT DISTINCT(COLUMN_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='INTERFACE' AND 
COLUMN_NAME NOT IN (SELECT DISTINCT(excludeFieldName) FROM @excludeFieldTable)

SELECT *
FROM @intColumnList

<强> Results

| COLUMNLIST |
|------------|
|       COL1 |
|       COL2 |
|       COL3 |
|       COL4 |
|       COL5 |
|         ID |

已编辑:

使用字符串,它看起来像这样:

查询2

DECLARE @excludeFieldTable VARCHAR(1000)

SET @excludeFieldTable = 'CASENO, INTLINENO, INTMEMBNO, INTSTATUS, RECTYPE, EFFDTE, INTERR, INTERR2, INTWARN, AUTHORISED, EXCLUDE, UPDATED, INTMEMBNO2, INTSTATUS2, ALTKEY'

DECLARE @intColumnList TABLE
(
  columnList varchar(100)
)
INSERT INTO @intColumnList 
SELECT DISTINCT(COLUMN_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='INTERFACE' AND 
', '+@excludeFieldTable+', ' NOT LIKE '%, '+COLUMN_NAME+', %'

SELECT *
FROM @intColumnList

<强> Results

| COLUMNLIST |
|------------|
|       COL1 |
|       COL2 |
|       COL3 |
|       COL4 |
|       COL5 |
|         ID |

重新编辑:

SP工作正常:

查询3

CREATE PROCEDURE ExcludeField1 AS
DECLARE @excludeFieldTable VARCHAR(1000)

SET @excludeFieldTable = 'CASENO, INTLINENO, INTMEMBNO, INTSTATUS, RECTYPE, EFFDTE, INTERR, INTERR2, INTWARN, AUTHORISED, EXCLUDE, UPDATED, INTMEMBNO2, INTSTATUS2, ALTKEY'

DECLARE @intColumnList TABLE
(
  columnList varchar(100)
)
INSERT INTO @intColumnList 
SELECT DISTINCT(COLUMN_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='INTERFACE' AND 
', '+@excludeFieldTable+', ' NOT LIKE '%, '+COLUMN_NAME+', %'

SELECT * FROM @intColumnList

<强> Results

查询4

CREATE PROCEDURE ExcludeField2 AS
DECLARE @excludeFieldTable TABLE
(
  excludeFieldName varchar(100)
)
INSERT INTO @excludeFieldTable VALUES 
('CASENO'),('INTLINENO'),('INTMEMBNO'),('INTSTATUS'),
('RECTYPE'),('EFFDTE'),('INTERR'),('INTERR2'),
('INTWARN'),('AUTHORISED'),('EXCLUDE'),('UPDATED'),
('INTMEMBNO2'),('INTSTATUS2'),('ALTKEY')

DECLARE @intColumnList TABLE
(
  columnList varchar(100)
)
INSERT INTO @intColumnList 
SELECT DISTINCT(COLUMN_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='INTERFACE' AND 
COLUMN_NAME NOT IN (SELECT DISTINCT(excludeFieldName) FROM @excludeFieldTable)

SELECT * FROM @intColumnList

<强> Results

查询5

EXEC ExcludeField1

<强> Results

| COLUMNLIST |
|------------|
|       COL1 |
|       COL2 |
|       COL3 |
|       COL4 |
|       COL5 |
|         ID |

查询6

EXEC ExcludeField2

<强> Results

| COLUMNLIST |
|------------|
|       COL1 |
|       COL2 |
|       COL3 |
|       COL4 |
|       COL5 |
|         ID |

如果您想在之前定义排除字符串,它将如下所示:

查询7

CREATE PROCEDURE ExcludeField1 @excludeFieldString varchar(1000) AS

DECLARE @intColumnList TABLE
(
  columnList varchar(100)
)
INSERT INTO @intColumnList 
SELECT DISTINCT(COLUMN_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='INTERFACE' AND 
', '+@excludeFieldString+', ' NOT LIKE '%, '+COLUMN_NAME+', %'

SELECT * FROM @intColumnList

<强> Results

查询8

DECLARE @excludeFieldTable VARCHAR(1000)

SET @excludeFieldTable = 'CASENO, INTLINENO, INTMEMBNO, INTSTATUS, RECTYPE, EFFDTE, INTERR, INTERR2, INTWARN, AUTHORISED, EXCLUDE, UPDATED, INTMEMBNO2, INTSTATUS2, ALTKEY'

EXEC ExcludeField1 @excludeFieldString = @excludeFieldTable

<强> Results

| COLUMNLIST |
|------------|
|       COL1 |
|       COL2 |
|       COL3 |
|       COL4 |
|       COL5 |
|         ID |

答案 3 :(得分:0)

向所有人道歉(非常感谢您的时间) - 我的SP代码中有一个小错误