Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.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 如何检查每条记录中是否有多个列不为空?_Sql_Oracle - Fatal编程技术网

Sql 如何检查每条记录中是否有多个列不为空?

Sql 如何检查每条记录中是否有多个列不为空?,sql,oracle,Sql,Oracle,我有一个表,其中包含4个字段ethno_1、ethno_2、ethno_3和ethno_4 我需要使用这四个字段来: 当只有一个字段包含值时,将v_ethno_code变量设置为存储的种族 如果其中多个列包含值,请将v_ethno_code变量设置为“未知” 样本数据: 我尝试过嵌套条件来说明ethno_1是否为null,将其设置为该值,然后检查ethno_2是否为null,返回并将变量设置为unknown,等等。。。但这在逻辑上是行不通的,而且代码比我认为有效的要多得多。检查这一点的正确方法

我有一个表,其中包含4个字段ethno_1、ethno_2、ethno_3和ethno_4

我需要使用这四个字段来:

  • 当只有一个字段包含值时,将v_ethno_code变量设置为存储的种族
  • 如果其中多个列包含值,请将v_ethno_code变量设置为“未知”
  • 样本数据:


    我尝试过嵌套条件来说明ethno_1是否为null,将其设置为该值,然后检查ethno_2是否为null,返回并将变量设置为unknown,等等。。。但这在逻辑上是行不通的,而且代码比我认为有效的要多得多。检查这一点的正确方法是什么?

    不是最漂亮的,但是您可以使用case查找null count when Not null when 1,然后coalese显示单个值,否则未知

    With CTE (Ethn_1, Ethn_2, Ethn_3, Ethn_4) as (
    Select 'AS', Null,null,null from dual union all
    select null,null,'WH',null from dual union all
    select null,'BL',null,null from dual union all
    select 'AS','BL',NULL,null from dual union all
    select null,null,null,'HO' from dual union all
    select null,null,'WH','HO' from dual union all
    select null,'BL',null,'HO' from dual)
    
    Select A.*, Case when (Case when Ethn_1 is not null then 1 else 0 end +
                           Case when Ethn_2 is not null then 1 else 0 end+
                           Case when Ethn_3 is not null then 1 else 0 end+
                           Case when Ethn_4 is not null then 1 else 0 end) = 1 
                     then coalesce(Ethn_1, Ethn_2, Ethn_3, Ethn_4) 
                     else 'UNKNOWN' end AS v_ethn_code 
    from cte A;
    
    或检查是否为null并计数3

    Select A.*, Case when (case when Ethn_1 is null then 1 else 0 end+
                           Case when Ethn_2 is null then 1 else 0 end+
                           Case when Ethn_3 is null then 1 else 0 end+
                           Case when Ethn_4 is null then 1 else 0 end) = 3
                     then coalesce(Ethn_1, Ethn_2, Ethn_3, Ethn_4) 
                     else 'UNKNOWN' end AS v_ethn_code
    from cte A;
    
    我找不到一个可以避免case语句的空检查结果为1,0的函数

    导致:

    +--------+--------+--------+--------+-------------+
    | ETHN_1 | ETHN_2 | ETHN_3 | ETHN_4 | V_ETHN_CODE |
    +--------+--------+--------+--------+-------------+
    | AS     |        |        |        | AS          |
    |        |        | WH     |        | WH          |
    |        | BL     |        |        | BL          |
    | AS     | BL     |        |        | UNKNOWN     |
    |        |        |        | HO     | HO          |
    |        |        | WH     | HO     | UNKNOWN     |
    |        | BL     |        | HO     | UNKNOWN     |
    +--------+--------+--------+--------+-------------+
    

    不是最漂亮的,但是您可以使用case在Not null when 1时查找null计数,然后coalese显示单个值,否则未知

    With CTE (Ethn_1, Ethn_2, Ethn_3, Ethn_4) as (
    Select 'AS', Null,null,null from dual union all
    select null,null,'WH',null from dual union all
    select null,'BL',null,null from dual union all
    select 'AS','BL',NULL,null from dual union all
    select null,null,null,'HO' from dual union all
    select null,null,'WH','HO' from dual union all
    select null,'BL',null,'HO' from dual)
    
    Select A.*, Case when (Case when Ethn_1 is not null then 1 else 0 end +
                           Case when Ethn_2 is not null then 1 else 0 end+
                           Case when Ethn_3 is not null then 1 else 0 end+
                           Case when Ethn_4 is not null then 1 else 0 end) = 1 
                     then coalesce(Ethn_1, Ethn_2, Ethn_3, Ethn_4) 
                     else 'UNKNOWN' end AS v_ethn_code 
    from cte A;
    
    或检查是否为null并计数3

    Select A.*, Case when (case when Ethn_1 is null then 1 else 0 end+
                           Case when Ethn_2 is null then 1 else 0 end+
                           Case when Ethn_3 is null then 1 else 0 end+
                           Case when Ethn_4 is null then 1 else 0 end) = 3
                     then coalesce(Ethn_1, Ethn_2, Ethn_3, Ethn_4) 
                     else 'UNKNOWN' end AS v_ethn_code
    from cte A;
    
    我找不到一个可以避免case语句的空检查结果为1,0的函数

    导致:

    +--------+--------+--------+--------+-------------+
    | ETHN_1 | ETHN_2 | ETHN_3 | ETHN_4 | V_ETHN_CODE |
    +--------+--------+--------+--------+-------------+
    | AS     |        |        |        | AS          |
    |        |        | WH     |        | WH          |
    |        | BL     |        |        | BL          |
    | AS     | BL     |        |        | UNKNOWN     |
    |        |        |        | HO     | HO          |
    |        |        | WH     | HO     | UNKNOWN     |
    |        | BL     |        | HO     | UNKNOWN     |
    +--------+--------+--------+--------+-------------+
    

    试着这样做:

    select id, case when nulls=3 then coalesce(ethn_1, ethn_2, ethn_3, ethn_4) else 'Unknown' end variablevalue from (
    select a.*, b.nulls from users a join (
    select id, case when ethn_1 is null then 1 else 0 end+  
    case when ethn_2 is null then 1 else 0 end +
    case when ethn_3 is null then 1 else 0 end +
    case when ethn_4 is null then 1 else 0 end nulls
    from users
    group by id, ethn_1, ethn_2, ethn_3, ethn_4) b on a.id=b.id)a
    

    试着这样做:

    select id, case when nulls=3 then coalesce(ethn_1, ethn_2, ethn_3, ethn_4) else 'Unknown' end variablevalue from (
    select a.*, b.nulls from users a join (
    select id, case when ethn_1 is null then 1 else 0 end+  
    case when ethn_2 is null then 1 else 0 end +
    case when ethn_3 is null then 1 else 0 end +
    case when ethn_4 is null then 1 else 0 end nulls
    from users
    group by id, ethn_1, ethn_2, ethn_3, ethn_4) b on a.id=b.id)a
    
    试试这个-

    质疑-

    输出

    试试这个-

    质疑-

    输出


    请以文本格式发布示例数据。您能推荐一个用于格式化的示例吗?我花了20分钟试图将数据格式化为文本格式,但缺少表格显示使其变得相当困难。只需为我们写出CREATETABLE insert语句,它不会花费太长时间-只需一个示例,就可以了解如何格式化您的问题。例如,您可以使用创建“ASCII表”,然后按照中的说明将其格式化为“代码”,以生成文本格式的请发布示例数据。您可以建议格式化示例吗?我花了20分钟试图将数据格式化为文本格式,但缺少表格显示使其变得相当困难。只需为我们写出CREATETABLE insert语句,它不会花费太长时间-只需一个示例,就可以了解如何格式化您的问题。例如,您可以使用创建“ASCII表”,然后按照中的说明将其格式化为“代码”,以生成