返回提供列表的非匹配值

时间:2012-02-04 17:43:36

标签: sql

假设我有一张表USR

user_name     User_id
Abcd             1
Abce             2
Abcf             3

现在,如果我点击了

这样的查询
Select user_name from USR where user_name IN ('Abcd','Abce','Abcg','Avfd','Asdf')

我得到了一个输出

Abcd
Abce

现在如果我想要这个非匹配参数的输出怎么办。

Abcg
Avfd
Asdf

有没有办法实现这个目标?

感谢您的建议。

编辑:我没有权限创建任何东西&只能做DQL

3 个答案:

答案 0 :(得分:0)

如何制作新表Temp

abcd
abce
abcg
avfd
asdf

然后

Select user_name from Temp where user_name NOT IN USR

答案 1 :(得分:0)

您的原始查询:

SELECT user_name 
FROM usr
WHERE user_name IN ('Abcd','Abce','Abcg','Avfd','Asdf')
  ;

要反转逻辑,只需添加“NOT”:

SELECT user_name 
FROM usr
WHERE user_name NOT IN ('Abcd','Abce','Abcg','Avfd','Asdf')
  ;

哎呀,看起来你想要它反过来:(解决方案可能需要其他语法,具体取决于你的DBMS / SQL方言)Postgresql的这种语法是通过CTE:

WITH zzz(zname) AS (
        VALUES ('three'),('four'), ('five')
        )
SELECT * FROM zzz
        WHERE zzz.zname NOT IN (select zname FROM usr)
        ;

生成一些数据:

SET search_path='tmp';
DROP TABLE usr;
CREATE TABLE usr
        ( id INTEGER NOT NULL
        , zname varchar
        );
INSERT INTO usr(id,zname) VALUES
 ( 1, 'one'),( 2, 'two')
,( 3, 'three'),( 4, 'four')
        ;

结果:

SET
DROP TABLE
CREATE TABLE
INSERT 0 4
 zname 
-------
 five
(1 row)

答案 2 :(得分:0)

假设您正在使用可以使用SQL Server 2008 TV Constructors:

SELECT user_name 
FROM (VALUES('Abcd'),('Abce'),('Abcg'),('Avfd'),('Asdf')) AS Q(user_name)

EXCEPT

SELECT [USER_NAME]
FROM #USER

这适用于任何RDBMS(我认为):

SELECT 'Abcd' AS [user_name]
UNION SELECT 'Abce' 
UNION SELECT 'Abcg'
UNION SELECT 'Avfd'
UNION SELECT 'Asdf'

EXCEPT

SELECT [user_name]
FROM #USER