Sql server 如果值为空,则跳过条件
这应该很简单;然而,我不能用CASE语句来概括它Sql server 如果值为空,则跳过条件,sql-server,Sql Server,这应该很简单;然而,我不能用CASE语句来概括它 DECLARE @Test INT = NULL SELECT * FROM StoreImages WHERE Quality = 1 AND Ready = @Test 我想完成类似的工作: DECLARE @Test INT = NULL SELECT * FROM StoreImages CASE @Test IS NOT NULL WHERE Quality = 1 AND Ready = @Test ELSE WHERE Q
DECLARE @Test INT = NULL
SELECT *
FROM StoreImages
WHERE Quality = 1 AND Ready = @Test
我想完成类似的工作:
DECLARE @Test INT = NULL
SELECT *
FROM StoreImages
CASE @Test IS NOT NULL
WHERE Quality = 1 AND Ready = @Test
ELSE
WHERE Quality = 1
更新
我创建了一个模式示例,用于快速测试提供的答案
--create a temporary table
CREATE TABLE #ImagesTable(
Quality BIT,
Ready BIT)
-- insert into the temporary table
INSERT INTO #ImagesTable(Quality,Ready)
VALUES (1, 1);
INSERT INTO #ImagesTable(Quality,Ready)
VALUES (1, 1);
INSERT INTO #ImagesTable(Quality,Ready)
VALUES (1, 1);
INSERT INTO #ImagesTable(Quality,Ready)
VALUES (1, 1);
INSERT INTO #ImagesTable(Quality,Ready)
VALUES (1, 1);
INSERT INTO #ImagesTable(Quality,Ready)
VALUES (1, 0);
INSERT INTO #ImagesTable(Quality,Ready)
VALUES (1, 0);
INSERT INTO #ImagesTable(Quality,Ready)
VALUES (1, 0);
INSERT INTO #ImagesTable(Quality,Ready)
VALUES (1, 0);
INSERT INTO #ImagesTable(Quality,Ready)
VALUES (1, 0);
- 将@Test声明为null应返回所有
- 将@Test声明为1或0应返回一半记录
- 我会像这样做:
DECLARE @Test INT = NULL
SELECT *
FROM #ImagesTable
WHERE (Quality = 1 AND Ready = @Test) OR Quality = 1;
如果@Test
中存在值,则可以使用大小写,而不是NULL
,如:
DECLARE @Test INT = NULL
SELECT *
FROM #ImagesTable
WHERE Quality = 1 AND Ready = (CASE WHEN @Test IS NULL THEN 1 ELSE @Test END);
更新:
正如我所看到的,Ready
列中只有两个值0
或1
:
SELECT *
FROM #ImagesTable
WHERE (Quality = 1 AND Ready IN ( ISNULL(@Test, 0), ISNULL(@Test, 1) ) );
这里有一个你可以玩的。我想这样做:
DECLARE @Test INT = NULL
SELECT *
FROM #ImagesTable
WHERE (Quality = 1 AND Ready = @Test) OR Quality = 1;
如果@Test
中存在值,则可以使用大小写,而不是NULL
,如:
DECLARE @Test INT = NULL
SELECT *
FROM #ImagesTable
WHERE Quality = 1 AND Ready = (CASE WHEN @Test IS NULL THEN 1 ELSE @Test END);
更新:
正如我所看到的,Ready
列中只有两个值0
或1
:
SELECT *
FROM #ImagesTable
WHERE (Quality = 1 AND Ready IN ( ISNULL(@Test, 0), ISNULL(@Test, 1) ) );
这是一个你可以玩的。我想你想要
SELECT *
FROM #ImagesTable
WHERE Quality IS NULL
OR (
Quality = 1 AND
Ready = @Test
)
我想你想要
SELECT *
FROM #ImagesTable
WHERE Quality IS NULL
OR (
Quality = 1 AND
Ready = @Test
)
通常,在可空参数周围使用ISNULL或CASE表达式是不好的做法。根据查询的复杂性,它可能会对优化者造成严重破坏,导致查询计划选择不当
不要使用案例,而是使用IF来打断您的查询:
DECLARE @Test int = NULL;
IF @Test IS NULL BEGIN
SELECT *
FROM #ImagesTable IT
WHERE IT.Quality = 1;
END ELSE BEGIN
SELECT *
FROM #ImagesTable IT
WHERE IT.Quality = 1
AND IT.Ready = @Test;
END
萨米的第一个答案会给你带来问题。无论@Test的值是多少,如果一行的质量为1,则将返回该行
编辑:
如果必须使用类似于CASE表达式的内容,则正确的语法为:
SELECT *
FROM #ImagesTable IT
WHERE IT.Quality = 1
AND (IT.Ready = @Test OR @Test IS NULL);
通常,在可空参数周围使用ISNULL或CASE表达式是不好的做法。根据查询的复杂性,它可能会对优化者造成严重破坏,导致查询计划选择不当
不要使用案例,而是使用IF来打断您的查询:
DECLARE @Test int = NULL;
IF @Test IS NULL BEGIN
SELECT *
FROM #ImagesTable IT
WHERE IT.Quality = 1;
END ELSE BEGIN
SELECT *
FROM #ImagesTable IT
WHERE IT.Quality = 1
AND IT.Ready = @Test;
END
萨米的第一个答案会给你带来问题。无论@Test的值是多少,如果一行的质量为1,则将返回该行
编辑:
如果必须使用类似于CASE表达式的内容,则正确的语法为:
SELECT *
FROM #ImagesTable IT
WHERE IT.Quality = 1
AND (IT.Ready = @Test OR @Test IS NULL);
WHERE(Quality=1和Ready=@Test)或Quality=1
?WHERE(Quality=1和Ready=@Test)或Quality=1
?你是想把CASE
语句留在那里吗?@R.Richards对不起,这是操作码的副本/过去:)谢谢!我还以为SQL Server中有一个新功能呢。:)@usefulBee查看更新时不需要太多代码,也不需要CASE
或如果@usefulBee是的,我看到了,这就是为什么我用isnull
给出另一种方法的原因。你是想把CASE
语句留在那里吗?@R.Richards抱歉,这是从操作代码的副本/过去:)谢谢!我还以为SQL Server中有一个新功能呢。:)@usefulBee看到的更新不需要太多代码,也不需要CASE
或IF
@usefulBee是的,我看到了,这就是为什么我给出了另一种方法使用isnull
我不知道sql server中有IF语句…酷!您是对的@Sami的答案也不准确,我仍在测试并尝试改进代码示例。是的,如果和WHILE在SQL Server中都可用。它们不能用作WHERE、SELECT等语法的一部分,但它们仍然可以用作逻辑流运算符,类似于它们在编程语言中的使用方式。有用的是,经过编辑的代码完全是错误的。。。它不是有效的语法。我将恢复您的编辑。已修复。手工编辑是不好的:)出色的工作和对细节的关注@Larnu Sami会给你带来问题,或者,因为没有足够的信息,当OP给出详细信息时,我会给出解决方案(如果有)。我不知道sql server中有if语句…酷!您是对的@Sami的答案也不准确,我仍在测试并尝试改进代码示例。是的,如果和WHILE在SQL Server中都可用。它们不能用作WHERE、SELECT等语法的一部分,但它们仍然可以用作逻辑流运算符,类似于它们在编程语言中的使用方式。有用的是,经过编辑的代码完全是错误的。。。它不是有效的语法。我将恢复您的编辑。已修复。手工编辑是不好的:)出色的工作和对细节的关注@Larnu Sami会给你带来问题,或者,因为没有足够的信息,当OP给出详细信息时,我会给出解决方案(如果有)。