Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如果值为空,则跳过条件_Sql Server - Fatal编程技术网

Sql server 如果值为空,则跳过条件

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

这应该很简单;然而,我不能用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 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给出详细信息时,我会给出解决方案(如果有)。