Sql server 2012 SQL Server在where条件内时选择大小写

Sql server 2012 SQL Server在where条件内时选择大小写,sql-server-2012,Sql Server 2012,我的代码是这样的 SELECT A, B, C FROM tb_1 WHERE C = (SELECT CASE WHEN (B > C) THEN C ELSE NULL END FROM tb_2) SELECT A, B, C FROM tb_1 WHERE C = NULL SELECT A, B, C FROM tb_1 WHERE C IS NULL 我想从tb_1中选择具有指定条件的行。当子查询的结果是C列的值时,它工作得很好。但是当结果为空时,它不能选择数

我的代码是这样的

SELECT A, B, C 
FROM tb_1 
WHERE C = (SELECT CASE WHEN (B > C) THEN C ELSE NULL END FROM tb_2)
SELECT A, B, C 
FROM tb_1 
WHERE C = NULL
SELECT A, B, C 
FROM tb_1 
WHERE C IS NULL
我想从tb_1中选择具有指定条件的行。当子查询的结果是C列的值时,它工作得很好。但是当结果为空时,它不能选择数据。因为SQL Server无法执行类似的操作

SELECT A, B, C 
FROM tb_1 
WHERE C = (SELECT CASE WHEN (B > C) THEN C ELSE NULL END FROM tb_2)
SELECT A, B, C 
FROM tb_1 
WHERE C = NULL
SELECT A, B, C 
FROM tb_1 
WHERE C IS NULL
但是,应该是这样的

SELECT A, B, C 
FROM tb_1 
WHERE C = (SELECT CASE WHEN (B > C) THEN C ELSE NULL END FROM tb_2)
SELECT A, B, C 
FROM tb_1 
WHERE C = NULL
SELECT A, B, C 
FROM tb_1 
WHERE C IS NULL
有人能帮我吗?我仍然希望在满足该条件时插入子查询select case

谢谢

从您的问题来看,表tb_2的设计不清楚。假设tb_2结构与tb_1相同,我认为以下方法可行,但这一切都取决于您的数据,尤其是C列中的值。例如,如果保存在C中的值永远不会是-9999,那么您可以在WHERE子句中使用ISNULL,如下所示。但是,我建议尽可能避免子查询

WHERE ISNULL(C, -9999) IN (SELECT CASE WHEN (B > C) THEN ISNULL(C, -9999) ELSE -9999 END FROM @t2)
说明:

GO
DECLARE @T1 TABLE (A INT, B INT, C INT)
INSERT INTO @T1 (A, B)VALUES (10, 20),(1, 2)

DECLARE @T2 TABLE (A INT, B INT, C INT)
INSERT INTO @T2 (A, B)VALUES (10, 20),(1, 2)

SELECT A, B, C 
FROM @t1 
WHERE ISNULL(C, -9999) IN (SELECT CASE WHEN (A > B) THEN ISNULL(C, -9999) ELSE -9999 END FROM @t2)