我有一个表格,其中包含多次出现数字值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
答案 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