【问题标题】:Matching rows without filtering (SQL)匹配行而不过滤 (SQL)
【发布时间】:2009-05-21 17:48:27
【问题描述】:

我有一些产品属性的表格:

table properties(
  prop_id int,
  product_id int
)

我的问题是:是否可以选择匹配的属性而不从结果中过滤它们?例如:

select property_id from properties WHERE property_id IN(1,3,5);

您只会得到匹配 1,3,5 的行。 我需要所有行,但需要哪些行符合我的条件的信息。 我不想使用'UNION'。

感谢您的帮助。

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    我没有使用 mySQL 的经验,但假设它支持 case 语句(或类似的东西),你可以这样做:

    select
        prop_id,
        product_id,
        (case when prop_id in (1, 3, 5) then 1 else 0 end) as matches_criteria
    
    from properties
    

    【讨论】:

    • +1 mySQL确实支持case语句,但是需要以'end case'结尾
    • 您的 MySQL 语法对我来说看起来不错。对提问者:所以使用 Adam 的语法,您会得到一个新列——如果该列是 1,那么该行符合您的条件。
    • 噢! @birdlips 说得对。 dev.mysql.com/doc/refman/5.0/en/case-statement.html 我做了一个糟糕的语法检查器。 :-)
    • 为什么在这里投票?这个问题的措辞不是很好,但他们正在寻找一个左连接,而不是一个案例。
    • 只有CASE作为单独的语句需要END CASE。 SELECT 中的 CASE 以 END 结尾,而不是 END CASE。
    【解决方案2】:

    你可以使用case语句:

    SELECT 
      prop_id, 
      product_id, 
      (CASE 
        WHEN property_id IN(1,3,5) THEN 1 
        ELSE 0 
      END)
    FROM  properties;
    

    http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

    【讨论】:

      【解决方案3】:

      左外连接

      select
          parent.name
              ,child.name
          from parent
              left outer join child on parent.familyid=child.familyid
      

      将列出所有父母,无论他们是否有孩子

      【讨论】:

      • OP 的评论说明了一切,他们不想要 CASE 声明
      【解决方案4】:
      SELECT
          IF (property_id IN (1, 3, 5), 1, 0) AS matched
      FROM
          properties;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-13
        • 1970-01-01
        • 2014-11-25
        • 2022-01-18
        • 1970-01-01
        • 2014-11-20
        • 1970-01-01
        相关资源
        最近更新 更多