代码之家  ›  专栏  ›  技术社区  ›  danielo

透视结构表中的WHERE子句

  •  1
  • danielo  · 技术社区  · 6 年前

    我在DB2(Oracle语法)中有一个这样的表,我们称之为sample

    ID    TAG_NAME    VALUE
    13    10          77
    13    11          80
    14    10          92
    14    11          83
    

    我要做的是选择所有的行,其中标记“名称10”的值为77,标记“名称11”的值为80。我该怎么做?如果我在下面这样做,它将尝试创建这样一种情况:标记名必须同时为10和11,而值必须同时为77和80。我不想选择这些特定的标记名,而是当标记名为x时,它应该检查值是否为y等。

    SELECT 
        * 
    FROM 
        SAMPLE
    WHERE
        (TAG_NAME=10 AND VALUE=77)
        AND (TAG_NAME=11 AND VALUE=80)
    

    我想要达到的结果是:

    ID    TAG_NAME    VALUE
    13    10          77
    13    11          80
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    你可以用 group by having :

    SELECT s.id
    FROM SAMPLE s
    WHERE (TAG_NAME = 10 AND VALUE = 77) OR
          (TAG_NAME = 11 AND VALUE = 80)
    GROUP BY s.id
    HAVING COUNT(DISTINCT TAG_NAME) = 2;
    
        2
  •  1
  •   William Robertson    6 年前

    我不知道DB2,但在Oracle中可以这样做:

    select *
    from   demo
    where  (tag_name, value) in ((10,77), (11,80));
    
        3
  •  0
  •   jackic23    6 年前

    当你说:

    如果我喜欢下面的内容,它将尝试创建一个标签名 必须两者都是 10和11,而值必须同时为77和80

    如果你把它改成或者它应该起作用。

    SELECT 
        * .
    FROM 
        SAMPLE
    WHERE
        (TAG_NAME=10 AND VALUE=77)
        OR (TAG_NAME=11 AND VALUE=80)
        OR (TAG_NAME=x AND VALUE=y)