代码之家  ›  专栏  ›  技术社区  ›  abhishek

空的参数化查询

  •  2
  • abhishek  · 技术社区  · 5 年前

    我正试图基于传递的参数选择查询,但不知何故,查询在所有情况下都不起作用。

    假设这是我的问题:

    SELECT * FROM EMPLOYEE WHERE AGE = @pAge
    

    现在让我们考虑一下这张桌子

    EmpId | EmpName | Age 
    1     | Abhishek | 30  
    2     | Surajit  | NULL  
    3     | Utpal    | 44
    

    现在的问题是,当我传递@page=null时,它应该选择surajit,当我传递值时,它应该选择与指定值匹配的值。看起来很简单,但我没办法尝试。第一个查询不起作用,因为为空!= NULL。

    让我们看看我试过什么:

    SELECT * FROM EMPLOYEE WHERE (@pAge is null Or AGE = @pAge)
    

    这并不像当我传递空值时,它会选择所有内容。

    SELECT * FROM EMPLOYEE WHERE IsNull(@pAge, 0) = Age
    

    但它也不起作用…因为年龄!= 0。

    即使我试过这个案子,但它也不能正常工作。有人能简单地问我一下吗?

    3 回复  |  直到 5 年前
        1
  •  6
  •   HoneyBadger    5 年前

    如果要选择“空=空”,请尝试:

    SELECT * 
    FROM   EMPLOYEE 
    WHERE (
             (@pAge IS NULL AND AGE IS NULL)
          OR AGE = @pAge
          )
    
        2
  •  2
  •   Zeki Gumus    5 年前

    您还可以尝试将它们都转换为0(或任何您想要的值):

    SELECT  * 
    FROM    EMPLOYEE 
    WHERE   ISNULL(@pAge, 0) = ISNULL(Age,0)
    
        3
  •  1
  •   StepUp    5 年前

    通过检查 is NULL :

    DECLARE @tbl TABLE
    (
       id INT,
       name VARCHAR(50),
       age INT null
    )
    INSERT INTO @tbl
    (
        id,
        name,
        age
    )
    VALUES
    (1, 'Abhishek', 30),
    (2, 'Surajit',  NULL),
    (3, 'Utpal',  44)
    
    DECLARE @pAge INT = null
    SELECT * FROM @tbl t
    WHERE t.age IN (@pAge) OR (t.age IS NULL AND @pAge IS null)