检查列是否在sql中返回一组值

时间:2015-04-19 07:48:21

标签: sql-server where-clause

我有一个表格,其中包含多次出现数字值1,2和3的列。

SELECT * from table1 where column_name=1

SELECT * from table1 where column_name=2

SELECT * from table1 where column_name=3

我是否可以对单个查询进行这些查询,因为从单个表调用单个需求的3 sql select查询语句看起来很尴尬。 如果表格对每个条件至少有一行,我需要做一些事情。 我使用了以下查询:

SELECT * 
from table1 
where column_name IN (1,2,3). 

即使表中存在任何值的列,它也会返回数据。如果表的每个where子句至少有一行,则需要返回表。

我也尝试了以下查询:

SELECT *     
FROM table1 
where (column_name =1 
AND column_name =2 AND column_name =3)
//this returns null even if a single column has value 1,2 and 3

3 个答案:

答案 0 :(得分:1)

SELECT COUNT(DISTINCT column_name) FROM Table1

稍后检查结果是否为3,表示每个数字至少有一行

或者

SELECT column_name, COUNT(1) as Cnt FROM Table1 GROUP BY column_name

这将为您提供每个不同的数字+它的数量(表中有多少行)

或者

  DECLARE @numbers AS TABLE(N INT)
  INSERT INTO @numbers VALUES(1), (2), (3)

  SELECT column_name, 
         SUM(CASE WHEN column_name IS NOT NULL THEN 1 ELSE 0 END) AS Cnt
  FROM @numbers 
  LEFT JOIN Table1 ON @numbers.N = column_name
  GROUP BY column_name

这将为您提供每个数字,即使它在Table1中尚不存在(计数为0)

答案 1 :(得分:1)

您的第一个和第二个查询是相同的,并且应该返回相同的结果。

SELECT * 
FROM table1 
WHERE column_name IN (1,2,3)

这基本上是说:从table1获取所有行,其中column_name为 1 2 3

这是您的第三个查询的问题。您正在使用AND,并且由于column_name不能同时 1,2和3 ,因此不会返回任何内容。

如果您只想查看值是否存在(一个或多个),并应用其他过滤器,则可以使用:

WHERE EXISTS(SELECT column_name FROM table1 WHERE (column_name IN (1, 2, 3)))

答案 2 :(得分:1)

您可以使用以下查询:

SELECT MAX(CASE WHEN column_name = 1 THEN 1 END) +
       MAX(CASE WHEN column_name = 2 THEN 1 END) +
       MAX(CASE WHEN column_name = 3 THEN 1 END)
FROM table1 

检查指定条件是否满足。

如果所有三个3都包含在(1,2,3)的{​​{1}}列中(当然在单独的记录中),则上述内容将返回column_name ,和table1否则。

您现在可以在NULL中使用上述查询,如下所示:

CTE

返回表,如果表满足要求,即表中包含:

  • 至少有一个;WITH CTE AS ( SELECT MAX(CASE WHEN column_name = 1 THEN 1 END) + MAX(CASE WHEN column_name = 2 THEN 1 END) + MAX(CASE WHEN column_name = 3 THEN 1 END) AS cnt FROM table1 ) SELECT t.* FROM #table1 AS t CROSS JOIN CTE WHERE cnt = 3
  • 至少有一个column_name = 1
  • 至少有一个column_name = 2