복붙노트

[SQL] WHERE NULL이 절은 SQL Server 매개 변수 값에 따라 NULL 또는 NO가 없습니다

SQL

WHERE NULL이 절은 SQL Server 매개 변수 값에 따라 NULL 또는 NO가 없습니다

나는 매개 변수 값을 기준으로 검색을 수행 SQL Server 2000에서 저장 프로 시저가 있습니다. 절의 값에 따라 WHERE에 전달 된 매개 변수 중 하나, 나는 다른 필요 - 문제는 3 개 값이 곳 MyColumn이 될 것입니다

나는 올바른 구문을 세우는 약간의 정신 블록을 보내고 있습니다. BEGIN @parameter ... END의 분기를 일부 IF를 수행하지 않고 하나의 select 문에서이게 가능을 할까?

해결법

  1. ==============================

    1.다음은 WHERE 절 하나를 사용하여이 문제를 해결하는 방법입니다 :

    다음은 WHERE 절 하나를 사용하여이 문제를 해결하는 방법입니다 :

    WHERE (@myParm = value1 AND MyColumn IS NULL)
    OR  (@myParm = value2 AND MyColumn IS NOT NULL)
    OR  (@myParm = value3)
    

    나는 다음과 같은 의미 case 문의 순진 사용이 이것에 의해,하지 작업을 수행합니다 :

    SELECT Field1, Field2 FROM MyTable
    WHERE CASE @myParam
        WHEN value1 THEN MyColumn IS NULL
        WHEN value2 THEN MyColumn IS NOT NULL
        WHEN value3 THEN TRUE
    END
    

    case 문을 사용하여이 문제를 해결 답을 onedaywhen의 볼 수 있습니다

  2. ==============================

    2.당신은 같은 것을 할 수 있습니다 :

    당신은 같은 것을 할 수 있습니다 :

    SELECT *
    FROM foo
    WHERE (@param = 0 AND MyColumn IS NULL)
    OR (@param = 1 AND MyColumn IS NOT NULL)
    OR (@param = 2)
    

    뭐 그런.

  3. ==============================

    3.이것은이 사용 사례를 수행 할 수있는 방법입니다 :

    이것은이 사용 사례를 수행 할 수있는 방법입니다 :

    DECLARE @myParam INT;
    SET @myParam = 1;
    
    SELECT * 
      FROM MyTable
     WHERE 'T' = CASE @myParam
                 WHEN 1 THEN 
                    CASE WHEN MyColumn IS NULL THEN 'T' END
                 WHEN 2 THEN
                    CASE WHEN MyColumn IS NOT NULL THEN 'T' END
                 WHEN 3 THEN 'T' END;
    
  4. ==============================

    4.

    WHERE MyColumn = COALESCE(@value,MyColumn) 
    

    참조 : COALESCE (Transact-SQL)를 참조하십시오.

  5. ==============================

    5.CASE의 다른 방법 :

    CASE의 다른 방법 :

    SELECT *  
    FROM MyTable
    WHERE 1 = CASE WHEN @myParm = value1 AND MyColumn IS NULL     THEN 1 
                   WHEN @myParm = value2 AND MyColumn IS NOT NULL THEN 1 
                   WHEN @myParm = value3                          THEN 1 
              END
    
  6. ==============================

    6.나는이 솔루션으로 성공을 거두었습니다. 그것은 약간의 트위스트와 함께 거의 패트릭 같다. 당신은 개별적으로 또는 순차적으로 이러한 식을 사용할 수 있습니다. 매개 변수가 비어있는 경우, 그것은 무시되고 열의 모든 값은 사용자의 검색이 NULLS를 포함하여 표시됩니다.

    나는이 솔루션으로 성공을 거두었습니다. 그것은 약간의 트위스트와 함께 거의 패트릭 같다. 당신은 개별적으로 또는 순차적으로 이러한 식을 사용할 수 있습니다. 매개 변수가 비어있는 경우, 그것은 무시되고 열의 모든 값은 사용자의 검색이 NULLS를 포함하여 표시됩니다.

    SELECT * FROM MyTable
    WHERE 
        --check to see if @param1 exists, if @param1 is blank, return all
        --records excluding filters below
    (Col1 LIKE '%' + @param1 + '%' OR @param1 = '')
    AND
        --where you want to search multiple columns using the same parameter
        --enclose the first 'OR' expression in braces and enclose the entire 
        --expression 
    ((Col2 LIKE '%' + @searchString + '%' OR Col3 LIKE '%' + @searchString + '%') OR @searchString = '')
    AND
        --if your search requires a date you could do the following
    (Cast(DateCol AS DATE) BETWEEN CAST(@dateParam AS Date) AND CAST(GETDATE() AS DATE) OR @dateParam = '')
    
  7. ==============================

    7.이러한 논리가 존재하여 구현 될 수있다 :

    이러한 논리가 존재하여 구현 될 수있다 :

    CREATE TABLE tab(a INT, b VARCHAR(10));
    INSERT INTO tab(a,b) VALUES(1,'a'),(1, NULL),(NULL, 'a'),(2,'b');
    

    질문:

    DECLARE @a INT;
    
    --SET @a = 1;    -- specific NOT NULL value
    --SET @a = NULL; -- NULL value
    --SET @a = -1;   -- all values
    
    SELECT *
    FROM tab t
    WHERE EXISTS(SELECT t.a INTERSECT SELECT @a UNION SELECT @a WHERE @a = '-1');
    

    DB <> 바이올린 데모

    여러 PARAMS을 포함하도록 확장 할 수 있습니다 :

    SELECT *
    FROM tab t
    WHERE EXISTS(SELECT t.a INTERSECT SELECT @a UNION SELECT @a WHERE @a = '-1')
      AND EXISTS(SELECT t.b INTERSECT SELECT @b UNION SELECT @a WHERE @b = '-1');
    
  8. from https://stackoverflow.com/questions/810714/where-is-null-is-not-null-or-no-where-clause-depending-on-sql-server-parameter by cc-by-sa and MIT license