检查一列 returns 中的一组值是否在 sql
Check whether a column returns a set of values in sql
我有一个 table 有一列,其中仅包含多次出现的数值 1,2 和 3。
SELECT * from table1 where column_name=1
SELECT * from table1 where column_name=2
SELECT * from table1 where column_name=3
我是否可以将这些查询变成单个查询,因为从单个 table 为单个需求调用 3 sql select 查询语句看起来很尴尬。
如果 table 每个条件至少有一行,我需要做一些事情。
我使用了以下查询:
SELECT *
from table1
where column_name IN (1,2,3).
即使 table.I 中不存在具有任何值的列,它 return 数据也需要 return table 如果 table 每个 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
SELECT COUNT(DISTINCT column_name) FROM Table1
稍后检查结果是否为 3,这意味着每个数字至少有一行
或
SELECT column_name, COUNT(1) as Cnt FROM Table1 GROUP BY column_name
这将为您提供每个不同的数字 + 它的计数(您在 table 中有多少次该行)
或
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
这将为您提供所有数字,即使它在表 1 中尚不存在(计数为 0)
您的第一个和第二个查询相同,应该return相同的结果。
SELECT *
FROM table1
WHERE column_name IN (1,2,3)
这基本上是说:从表 1 中获取所有行,其中 column_name 是 1、2 或 3.
那是你第三个查询的问题。你正在使用 AND,这不会 return 你的情况,因为 column_name 不能同时是 1, 2 AND 3。
如果您只想查看值是否存在(一个或多个),并应用其他过滤器,您可以使用:
WHERE EXISTS(SELECT column_name FROM table1 WHERE (column_name IN (1, 2, 3)))
您可以使用以下查询:
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
检查是否满足指定条件。
如果 所有三个 值 (1,2,3)
都包含在 [=15 的 column_name
列中,则以上将 return 3
=](当然在单独的记录中),否则 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
到return的table,如果table满足要求,即如果table包含:
- 至少有一个行具有
column_name = 1
和
- 至少有一个行具有
column_name = 2
和
- 至少有一个 行
column_name = 3
我有一个 table 有一列,其中仅包含多次出现的数值 1,2 和 3。
SELECT * from table1 where column_name=1
SELECT * from table1 where column_name=2
SELECT * from table1 where column_name=3
我是否可以将这些查询变成单个查询,因为从单个 table 为单个需求调用 3 sql select 查询语句看起来很尴尬。 如果 table 每个条件至少有一行,我需要做一些事情。 我使用了以下查询:
SELECT *
from table1
where column_name IN (1,2,3).
即使 table.I 中不存在具有任何值的列,它 return 数据也需要 return table 如果 table 每个 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
SELECT COUNT(DISTINCT column_name) FROM Table1
稍后检查结果是否为 3,这意味着每个数字至少有一行
或
SELECT column_name, COUNT(1) as Cnt FROM Table1 GROUP BY column_name
这将为您提供每个不同的数字 + 它的计数(您在 table 中有多少次该行)
或
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
这将为您提供所有数字,即使它在表 1 中尚不存在(计数为 0)
您的第一个和第二个查询相同,应该return相同的结果。
SELECT *
FROM table1
WHERE column_name IN (1,2,3)
这基本上是说:从表 1 中获取所有行,其中 column_name 是 1、2 或 3.
那是你第三个查询的问题。你正在使用 AND,这不会 return 你的情况,因为 column_name 不能同时是 1, 2 AND 3。
如果您只想查看值是否存在(一个或多个),并应用其他过滤器,您可以使用:
WHERE EXISTS(SELECT column_name FROM table1 WHERE (column_name IN (1, 2, 3)))
您可以使用以下查询:
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
检查是否满足指定条件。
如果 所有三个 值 (1,2,3)
都包含在 [=15 的 column_name
列中,则以上将 return 3
=](当然在单独的记录中),否则 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
到return的table,如果table满足要求,即如果table包含:
- 至少有一个行具有
column_name = 1
和 - 至少有一个行具有
column_name = 2
和 - 至少有一个 行
column_name = 3