AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 84297
Accepted
IT researcher
IT researcher
Asked: 2014-12-05 04:45:11 +0800 CST2014-12-05 04:45:11 +0800 CST 2014-12-05 04:45:11 +0800 CST

在该 id 的另一列中选择具有相同 id 但为 null 和其他值的行

  • 772

我只想获取具有值NULL和其他值的行,而不是NULL特定用户名列。

如果该特定用户名的两行都为 null,或者两者都具有 null 以外的其他值,则它不应出现在输出中。如果相同的用户名有两行以上,并且具有 null 和其他一些值,那么它们应该出现。

下面是示例示例和输出。如何使用 sql 查询来完成?

+----------+-------+
| username | col2  |
+----------+-------+
| a        | abc   |
| a        | ef    |
| b        | null  |
| b        | null  |
| c        | der   |
| c        | null  |
+----------+-------+

输出

+----------+------+
| username | col2 |
+----------+------+
| c        | der  |
| c        | null |
+----------+------+
sql-server t-sql
  • 6 6 个回答
  • 53133 Views

6 个回答

  • Voted
  1. Best Answer
    Taryn
    2014-12-05T05:08:48+08:002014-12-05T05:08:48+08:00

    您应该能够使用条件聚合来获取具有 incol2和null.

    我建议使用带有条件的 HAVING 子句。查询类似于:

    select username
    from yourtable
    group by username
    having sum(case when col2 is not null then 1 else 0 end) = 1
      and sum(case when col2 is null then 1 else 0 end) = 1
    

    请参阅SQL Fiddle with Demo。此查询按每个用户名对您的数据进行分组,然后使用条件逻辑检查是否col2满足您想要的两个条件 - 其中col2不为空且 col2为空。

    然后,您可以在子查询等中使用它来获取username和col2值:

    select 
      t.username, 
      t.col2
    from yourtable t
    inner join
    (
      select username
      from yourtable
      group by username
      having sum(case when col2 is not null then 1 else 0 end) = 1
        and sum(case when col2 is null then 1 else 0 end) = 1
    ) d
      on t.username = d.username
    

    请参阅SQL Fiddle with Demo。

    如果你有不止col2一行同时包含null另一个值,那么你只需要HAVING稍微改变这个子句:

    select 
      t.username, 
      t.col2
    from yourtable t
    inner join
    (
      select username
      from yourtable
      group by username
      having sum(case when col2 is not null then 1 else 0 end) >= 1
        and sum(case when col2 is null then 1 else 0 end) >= 1
    ) d
      on t.username = d.username;
    

    请参阅带有演示的 SQL Fiddle

    • 12
  2. Paul White
    2014-12-06T04:45:17+08:002014-12-06T04:45:17+08:00

    另一种解决方案:

    SELECT Y1.*
    FROM dbo.yourtable AS Y1
    WHERE Y1.username = ANY
    (
        SELECT Y2.username 
        FROM dbo.yourtable AS Y2
        WHERE Y2.col2 IS NULL
        INTERSECT
        SELECT Y3.username 
        FROM dbo.yourtable AS Y3
        WHERE Y3.col2 IS NOT NULL
    );
    

    执行计划

    在类似的逻辑脉络中:

    SELECT Y.* 
    FROM dbo.yourtable AS Y
    WHERE EXISTS
        (
        SELECT * 
        FROM dbo.yourtable AS Y2 
        WHERE Y2.username = Y.username 
        AND Y2.col2 IS NULL
        )
    AND EXISTS
        (
        SELECT * 
        FROM dbo.yourtable AS Y3 
        WHERE Y3.username = Y.username 
        AND Y3.col2 IS NOT NULL
        );
    

    执行计划

    完后还有:

    SELECT
        SQ1.username,
        SQ1.col2
    FROM 
    (
        SELECT
            Y.username, 
            Y.col2,
            MinCol2 = 
                MIN(CASE WHEN Y.col2 IS NULL THEN -1 ELSE 1 END) 
                OVER (PARTITION BY Y.username), 
            MaxCol2 = 
                MAX(CASE WHEN Y.col2 IS NULL THEN -1 ELSE 1 END) 
                OVER (PARTITION BY Y.username)
        FROM dbo.yourtable AS Y
    ) AS SQ1
    WHERE 
        SQ1.MinCol2 = -SQ1.MaxCol2;
    

    执行计划

    • 8
  3. ypercubeᵀᴹ
    2014-12-06T04:45:29+08:002014-12-06T04:45:29+08:00

    只是另一种方法:

    ; WITH cte AS
      ( SELECT username, col2,
               cnt_all  = COUNT(*) OVER (PARTITION BY username),
               not_null = COUNT(col2) OVER (PARTITION BY username)
        FROM yourtable AS a
      )
    SELECT username, col2
    FROM cte
    WHERE cnt_all > not_null 
      AND not_null > 0 ;
    
    • 5
  4. JGA
    2014-12-05T05:44:44+08:002014-12-05T05:44:44+08:00

    这个也可以。 SQL Fiddle 演示

    我获得 C1 作为每个用户名的总行数,C2 作为每个用户名的总空行数,稍后我会比较这些值。

    SELECT username, col2 FROM
    (
    SELECT *,
    (SELECT Count(*) FROM T Where username = T1.username) C1,
    (SELECT Count(*) FROM T Where username = T1.username and col2 is null) C2
    FROM T T1
    ) T2
    WHERE C2 > 0 And C1 <> C2
    
    • 4
  5. Bosko
    2014-12-06T06:38:28+08:002014-12-06T06:38:28+08:00

    我会使用子查询来选择这些用户名,例如:

    select username
    from   dbo.yourtable
    group by username
    having sum(distinct case when col2 is not null then 1 else 2 end) = 3;
    
    • 3
  6. ammu
    2014-12-06T08:22:07+08:002014-12-06T08:22:07+08:00

    我试过这个...

    select a.username from  
    (select username ,col2 
       from yourtable
    where col2 is null) a,(select username ,col2 
                           from yourtable
                            where col2 is not null) b
    where a.username=b.username;
    
    • -1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve