首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于列值的SQL选择

基于列值的SQL选择
EN

Stack Overflow用户
提问于 2019-08-12 12:09:34
回答 7查看 91关注 0票数 2

我们有一个DB表,其中包含如下所示的公司职务代码:

代码语言:javascript
复制
ID       Code       Company
1        EW10       ***
2        EW10       DEU
3        EW10       DEC
4        EW20       ***
5        EW30       DEU
6        EW40       DEC

公司中的“*”表示可以在雇主级别(DEU、DEC)覆盖的企业级职务代码。

我需要一个select语句,它返回具有以下条件的行:

  • 如果没有特定于公司的代码(如EW20),则返回企业级行(例如,第4行)
  • 如果有特定于公司的行,则返回所有特定于公司的行。

我需要的结果集如下:

代码语言:javascript
复制
ID       Code       Company
2        EW10       DEU
3        EW10       DEC
4        EW20       ***
5        EW30       DEU
6        EW40       DEC
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2019-08-12 12:26:28

对于以下两种情况,您可以使用OR来完成此操作:

代码语言:javascript
复制
SELECT *
FROM   YourTable yt1
WHERE  Company <> '***'
   OR  NOT EXISTS (
          SELECT 1 FROM YourTable yt2
          WHERE yt2.Code = yt1.Code AND yt2.Company <> '***'
       )
票数 0
EN

Stack Overflow用户

发布于 2019-08-12 12:12:44

使用窗口函数。这比必要的要复杂一些,因为使用的是***而不是NULL。以下内容来回转换为NULL

代码语言:javascript
复制
select t.*,
       coalesce(nullif(company, '***'),
                max(nullif(company, '***')) over (partition by code),
                '***'
               )
from t;

编辑:

您的问题是要返回所有行。但是,您的示例数据则不然。

我想你可能想:

代码语言:javascript
复制
select t.*
from t
where t.company <> '***' or
      not exists (select 1
                  from t t2
                  where t2.code = t.code and
                        t2.company <> '***'
                 );

或者,具有窗口功能:

代码语言:javascript
复制
select t.*
from (select t.*,
             sum(case when company <> '***' then 1 else 0 end) over (partition by code) as num_notstars
      from t
     ) t
where (num_notstars > 0 and company <> '***') or
      (num_notstarts = 0);
票数 1
EN

Stack Overflow用户

发布于 2019-08-12 12:19:04

与UNION ALL一起处理这2起案件:

代码语言:javascript
复制
select * from tablename
where Company <> '***'
union all
select * from tablename t
where not exists (
  select 1 from tablename
  where Code = t.Code and Company <> '***'
)
order by Id

或者:

代码语言:javascript
复制
select * from tablename
where Company <> '***'
or Code in (
  select Code from tablename
  group by Code
  having min(Company) = '***' and max(Company) = '***'
)

演示

结果:

代码语言:javascript
复制
> ID | Code | Company
> -: | :--- | :------
>  2 | EW10 | DEU    
>  3 | EW10 | DEC    
>  4 | EW20 | ***    
>  5 | EW30 | DEU    
>  6 | EW40 | DEC  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57460948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档