Sql 声明的反面?
我觉得我要么是想得太多了,要么就是不可能,但有没有办法在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' 是否可以用更少的代码更高效地完成这项工作 编辑:我使用的是字符串值。我们的数据库没有空值,而是有一个空格值“” 我使用了建议的评论,并改为
而不是说:
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得到了它,刚刚编辑过。这是关于我的问题的第一条评论中推荐的,对我的需要非常有效。