【问题标题】:How to write IN clause query to replace null for no value parameter如何编写 IN 子句查询以将 null 替换为无值参数
【发布时间】:2012-11-05 14:24:35
【问题描述】:

我正在编写一个查询,其中 where 子句具有 IN 子句并且此 IN 子句中有大量值,我想获取结果,如果表中不存在 IN 子句中给出的值的值,那么包含 0 或 null 的原始值应返回该值。比如……

从 emp 中选择年龄、性别、date_joining,其中 name IN ('amit','john','paul','dilip')

现在假设对于这个查询,数据库中不存在 john 和 paul 的数据,那么结果应该如下所示..

21 男 21-AUG-2011 空空空 空空空 25 男 2010 年 8 月 9 日

如果 null 不可能,我们也可以用 0 代替 null

谢谢...

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:
    select  filter.name
    ,       emp.age
    ,       emp.sex
    ,       emp.date_joining 
    from    (
            values ('amit'), ('john'), ('paul'), ('dilip')
            ) filter(name)
    left join    
            emp
    on      emp.name = filter.name
    

    Live example at SQL Fiddle.

    对于 SQL Server 的旧值,将 values 行替换为:

    from    (
                      select 'amit'
            union all select 'john'
            union all select 'paul'
            union all select 'dilip'
            ) filter(name)
    

    【讨论】:

    • 嗨 Andomar,我不知道我的系统为什么会出现以下错误“关键字“值”附近的语法不正确。”
    • 可能是旧版本的SQL Server,我会更新答案
    【解决方案2】:

    你也可以使用公用表表达式来得到这个结果:

    ;With AllEmpDetails as
    (
    Select [Name] from emp
    UNION Select 'amit' 
    UNION Select 'john' 
    UNION Select 'paul' 
    UNION Select 'dilip'
    )Select AllEmpDetails.Name, e2.Age, e2.Sex, e2.date_joining 
    from AllEmpDetails 
    Left Join emp e2 on e2.[Name] = AllEmpDetails.Name
    

    在我的数据库中,我已经添加了 amitdilip 的详细信息,因此我使用了UNION,因为您可以轻松获取有关可用员工的详细信息。另一方面,您可以将UNION ALLDistinct 一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 2015-11-17
      • 2011-05-28
      • 2018-06-18
      • 1970-01-01
      • 2014-03-12
      • 2010-12-17
      相关资源
      最近更新 更多