Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.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 n列的快捷方式与相同常量进行比较?_Sql_Sql Server 2008_Tsql - Fatal编程技术网

Sql n列的快捷方式与相同常量进行比较?

Sql n列的快捷方式与相同常量进行比较?,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我找不到这个问题的答案。非常简单的问题,细节很少 有没有更好的方法来做这样的事情: SELECT * FROM tablename tn WHERE tn.col1 = 1 AND tn.col2 = 1 AND tn.col3 = 1 AND tn.col4 = 1 ... AND tn.coln = 1 如果多个列都必须以相同的方式与单个常量进行比较?我认为这是最好的方法。根据我的理解,没有其他更好的方法来实现这一点。关于我能想到

我找不到这个问题的答案。非常简单的问题,细节很少

有没有更好的方法来做这样的事情:

SELECT *
FROM tablename tn
WHERE tn.col1 = 1
      AND tn.col2 = 1
      AND tn.col3 = 1
      AND tn.col4 = 1
      ...
      AND tn.coln = 1

如果多个列都必须以相同的方式与单个常量进行比较?

我认为这是最好的方法。根据我的理解,没有其他更好的方法来实现这一点。

关于我能想到的唯一一件事(它只在某些情况下有用)是将一个持久化计算字段添加到使用如下逻辑的表本身。对于一个高度事务性的表,我不推荐这种方法,如果它是许多地方经常使用的过滤器,它甚至只会考虑它。所得到的是一个单一的值,您可以对其进行筛选和索引,以便对SELECT进行优化

ALTER TABLE [tablename] 
   ADD SAMEVALUE AS (CASE WHEN col1 = col2 AND col1 = col3 
       AND col1 = col4 AND .. col1 = coln THEN col1 ELSE NULL) PERSISTED 
我想这里“更好”的意思是“少打字”?如果是这样,您可以通过使用Intellisense或第三方工具来加快速度,或者如果您有大量的列,那么可以使用您最喜欢的脚本语言(Perl、Python、PowerShell等)为您生成
WHERE
子句。您甚至可以使用SQL本身:

select 'tn.' + quotename(name) + ' = 1 and '
from sys.columns
where object_id = object_id('MyTable')
and name like 'col%'

但是请记住,您阅读代码的时间比编写代码的时间要长得多,因此最重要的是查询的含义应该尽可能容易理解,并且您当前的查询已经非常清楚了。

如果您使用的是SQL 2012,您可能可以使用新的
CONCAT
功能,然后做一些类似于WHERE REPLACE(CONCAT(col1,col2,col3,col4,col5,col6),'1','')=',但这可能比不上上面的查询,可能也不太容易。是的,我希望能有类似于
(col1,col2,…,coln)=1
的东西,但这看起来是不可能的。我可以用不同的方式轻松解决我的具体问题,我只是想知道是否有更快的(打字)方式。