Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 声明的反面?_Sql_Sql Server - Fatal编程技术网

Sql 声明的反面?

Sql 声明的反面?,sql,sql-server,Sql,Sql Server,我觉得我要么是想得太多了,要么就是不可能,但有没有办法在SQL中的语句中执行反向的 而不是说: WHERE column_name NOT IN (x, y, z) 我希望有三列排除相同的值,如下所示: WHERE column1 NOT LIKE 'X' AND column2 NOT LIKE 'X' AND column3 NOT LIKE 'X' 是否可以用更少的代码更高效地完成这项工作 编辑:我使用的是字符串值。我们的数据库没有空值,而是有一个空格值“” 我使用了建议的评论,并改为

我觉得我要么是想得太多了,要么就是不可能,但有没有办法在SQL中的语句中执行反向的

而不是说:

WHERE column_name NOT IN (x, y, z)
我希望有三列排除相同的值,如下所示:

WHERE column1 NOT LIKE 'X' AND column2 NOT LIKE 'X' AND column3 NOT LIKE 'X'
是否可以用更少的代码更高效地完成这项工作

编辑:我使用的是字符串值。我们的数据库没有空值,而是有一个空格值“”

我使用了建议的评论,并改为:

WHERE '' NOT IN (column1, column2, column3)

它工作得很好

操作符
一样使用模式匹配,而
中的
没有

您可以使用
不类似
不在
中,但不能用
类似
替换
中的
,反之亦然

是否可以用更少的代码更高效地完成这项工作

可以将表达式缩短为:

where ' ' not in (column_1, column_2, column_3)
但在大多数数据库中,这对性能几乎没有影响。这样的构造可能不会使用索引


我想不出一种使用索引(在大多数数据库中)来表达这一点的方法。显然,如果经常需要这样做,可以使用基于函数的索引

CONCAT(column1, column2, column3) NOT LIKE '%X%'
另一个是使用铁人和戈登·林诺夫的建议,比如

'X' not in (column1, column2, column3)

第一种方法在大多数情况下都有效,但在任何列为
null
时都不起作用(
isnull
是解决该问题的一种方法,但会降低代码的吸引力)。第二种方法应适用于所有情况,除非左操作数是右操作数值中任何项的一部分(而不是等于其中任何项)。

您可以使用以下技术:

DECLARE @A VARCHAR(10) = 'A', @B VARCHAR(10) = 'A', @C VARCHAR(10) = 'B'
SELECT id, COUNT(*) FROM (VALUES (@A), (@B), (@C)) T (id) GROUP BY Id HAVING COUNT(*) > 1
现在,您可以将where语句重写如下:

WHERE NOT EXISTS(SELECT id, COUNT(*) FROM (VALUES (column1), (column2), (column3)) T (id) GROUP BY Id HAVING COUNT(*) > 1)

不确定它是否简化了事情,但如果上面的
WHERE
语句为真,这将确保所有3列都有不同的值。

因此
LIKE
不能与
中的
组合,但您可以将单个表达式中的多个列与
X Not IN(column1,column2,column3)进行比较
@IronMan我不知道你可以这样切换它们。你应该把它作为答案,我可以把它标对。工作得很好。啊,对-
操作符关注字符串(),而
[不]在
归属-你想要哪一个?@GordonLinoff得到了它,刚刚编辑过。这是关于我的问题的第一条评论中推荐的,对我的需要非常有效。