【问题标题】:SQL Multiple filter and matchSQL多重过滤和匹配
【发布时间】:2018-01-13 04:28:57
【问题描述】:
|variety    |Markertype |ConnectID  |Data|
|-----------|-----------|-----------|----|
|variety 1  |ATYPE1     |1          |AA  |
|variety 1  |ATYPE1     |1          |AA  |
|variety 1  |BTYPE1     |1          |AA  |
|variety 1  |CTYPE1     |1          |AA  |
|variety 1  |DTYPE1     |1          |--  |
|variety 1  |ATYPE2     |2          |CC  |
|variety 1  |BTYPE2     |2          |CC  |
|variety 1  |CTYPE2     |2          |CC  |
|variety 2  |ATYPE1     |1          |AA  |
|variety 2  |ATYPE1     |1          |AA  |
|variety 2  |BTYPE1     |1          |AA  |
|variety 3  |ATYPE1     |1          |AA  |
|variety 3  |ATYPE1     |1          |AA  |
|variety 3  |BTYPE1     |1          |AA  |
|variety 4  |ATYPE1     |1          |AA  |
|variety 5  |ATYPE1     |1          |AA  |
|variety 5  |BTYPE1     |1          |AA  |
|variety 5  |ATYPE1     |1          |AA  |
|variety 5  |ATYPE1     |1          |AA  |
|NULL       |BTYPE1     |1          |AA  |
|NULL       |DTYPE1     |1          |--  |
|NULL       |ATYPE2     |2          |CC  |
|NULL       |BTYPE2     |2          |CC  |
|NULL       |CTYPE2     |2          |CC  |
|variety 6  |ATYPE1     |1          |AA  |
|variety 6  |BTYPE1     |1          |AA  |
|variety 7  |ATYPE1     |1          |AA  |
|variety 7  |CTYPE1     |1          |AA  |
|variety 8  |ATYPE1     |1          |AA  |
|variety 8  |DTYPE1     |1          |AA  |

从上表中,我想过滤列'variety'中不为NULL的行以及具有相同连接ID但在markertype列中应具有ATYPE%和BTYPE%的品种

我正在尝试的代码是

select variety, Markertype, ConnectID, Data
where variety is NOT NULL
AND Markertype = ATYPE%  OR BTYPE%;

但这不起作用;我期待 16 cloumn 数据

variety 1,ATYPE1,1,AA
variety 1,ATYPE1,1,AA
variety 1,BTYPE1,1,AA
variety 1,ATYPE2,2,CC
variety 1,BTYPE2,2,CC
variety 2,ATYPE1,1,AA
variety 2,ATYPE1,1,AA
variety 2,BTYPE1,1,AA
variety 3,ATYPE1,1,AA
variety 3,ATYPE1,1,AA
variety 3,BTYPE1,1,AA
variety 5,ATYPE1,1,AA
variety 5,BTYPE1,1,AA
variety 5,ATYPE1,1,AA
variety 5,ATYPE1,1,AA
variety 6,ATYPE1,1,AA
variety 6,BTYPE1,1,AA

【问题讨论】:

  • 当然不行。我在您的查询中没有看到 FROM 子句。
  • 对不起!我没有添加完整的查询。这里的重点是如何过滤具有相同连接 ID 的 'ATYPE%' 和 'BTYPE%' 的品种
  • 您使用的是什么 DBMS? MySQL? SQL 服务器?甲骨文? PostgreSQL? ...

标签: sql filtering


【解决方案1】:

一种简单的方法:

select * 
from mytable a
where markertype like 'ATYPE%'
and exists 
(
  select * 
  from mytable b
  where b.markertype like 'BTYPE%'
  and b.variety = a.variety
  and b.connectid = a.connectid
)
union all
select * 
from mytable b
where markertype like 'BTYPE%'
and exists 
(
  select * 
  from mytable a
  where a.markertype like 'ATYPE%'
  and a.variety = b.variety
  and a.connectid = b.connectid
);

或者聚合:

select * 
from mytable a
where (markertype like 'ATYPE%' or markertype like 'BTYPE%')
and (variety, connectid) in
(
  select variety, connectid
  from mytable
  group by variety, connectid
  having count(case when markertype like 'ATYPE%' then 1 end) > 0
     and count(case when markertype like 'BTYPE%' then 1 end) > 0
);

【讨论】:

    【解决方案2】:

    如果我没有误解您的要求,以下查询将返回您所期望的:

    WITH CTE AS (
    SELECT DISTINCT T1.VARIETY, T2.CONNECTID FROM (SELECT variety, ConnectID   FROM myTable  WHERE  variety is not null and Markertype like  'ATYPE%') AS T1 
    INNER JOIN (SELECT variety, ConnectID   FROM myTable     WHERE  variety is not null and Markertype like  'BTYPE%') AS T2 ON T1.ConnectID = T2.ConnectID AND T1.variety = T2.variety  )
    
    SELECT  T.* FROM CTE INNER JOIN myTable  AS T ON CTE.ConnectID = T.ConnectID AND CTE.variety = T.variety WHERE  (Markertype like  'BTYPE%' OR Markertype like  'ATYPE%')   
    

    这将返回您显示的 17 行,但请注意您说的是

    我期待 16 列数据

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      查询中有几个问题。 你错过了From Clause (from Table_Name)(可能是你错过了在这里添加完整的查询)。

      = 替换为Like,因为= 将寻找完全相同的匹配项。

      select variety, Markertype, ConnectID, Data
      from Table_Name tbl1
      where variety is NOT NULL
      AND Markertype Like  'ATYPE%'  OR tbl1.Markertype Like 'BTYPE%'
      

      【讨论】:

      • 感谢纳齐尔。我想只过滤具有连接 ID 的品种,它应该有 'ATYPE%' 和 'BTYPE%'
      • 例如,我想过滤掉品种 7 和品种 8,因为它们没有 ATYPE% 和 BTYPE%
      【解决方案4】:

      确保您遵循SELECT 语句的正确语法。一起写ANDOR 时要注意括号。

      试试这个

      SELECT variety, Markertype, ConnectID, Data
        FROM TableName
      WHERE variety is NOT NULL AND 
         (Markertype Like  'ATYPE_'  OR Markertype Like 'BTYPE_')
      

      SELECT variety, Markertype, ConnectID, Data
        FROM TableName
      WHERE variety !='' AND 
         (Markertype Like  'ATYPE_'  OR Markertype Like 'BTYPE_')
      

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 2021-06-06
        • 1970-01-01
        • 2021-07-29
        • 1970-01-01
        • 2018-03-06
        • 1970-01-01
        相关资源
        最近更新 更多