【问题标题】:filter a column based on another column in oracle query根据oracle查询中的另一列过滤列
【发布时间】:2022-01-21 12:45:57
【问题描述】:

我有这样的桌子:

ID         | key | value
1          | A1  |o1
1          | A2  |o2
1          | A3  |o3
2          | A1  |o4
2          | A2  |o5
3          | A1  |o6
3          | A3  |o7
4          | A3  |o8

我想编写一个可以根据键列过滤值列的 oracle 查询。 像这样的东西

 select ID
    where 
    
    if key = A1 then value ='o1' 
    and key = A3 then value ='o4'

请帮我写这个查询。

***为了澄清我的问题,我需要 ID 列表以确保所有条件(键值)对它们都为真。对于每个 ID,我应该检查键值(使用 AND ),如果所有条件都为真,那么这个 ID 是可以接受的。

谢谢

【问题讨论】:

  • 该表是否已经有value 列,您能否通过将所需查询的每个案例和条件分开来更好地解释?
  • 这个问题并不完全清楚。如果键既不是 A1 也不是 A3 怎么办 - 例如,如果键是 A2 或 null 怎么办?您是否希望排除所有这些行(换句话说:您是否只想要键为 A1 或 A3 的行,而不需要其他行)?如果是这样,那就这么说吧。如果不是这样,那么你需要解释更多。
  • 为了澄清我的问题,我需要 ID 列表以确保所有条件(键值)对它们都是正确的。对于每个 ID,我应该检查键值(使用 AND ),如果所有条件都为真,那么这个 ID 是可接受的。 @BarbarosÖzhan
  • 嗨。同时,您最好编辑问题以澄清它。
  • 你的解释没有任何意义。您想要满足某些条件的“所有 id”(无论该条件是什么),但无论其他条件如何,您的 where 子句中已经有 ID=1。因此,如果任何其他 ID 满足您的“键、值”条件,则它不会是“可接受的”,因为它不满足 ID=1。对不起,但我继续前进。祝你好运!

标签: sql oracle


【解决方案1】:

IF 表示 PL/SQL。在 SQL 中,我们使用 CASE 表达式代替(或 DECODE,如果您愿意)。这样做,您会将value 移出表达式并使用如下内容:

where id = 1
  and value = case when key = 'A1' then 'o1'
                   when key = 'A3' then 'o4'
              end

【讨论】:

  • 谢谢。 when 子句的行为类似于 or 。这意味着像这样的 ID: id=1 and A1=o1 but A3 != o4 也在 result 中。但我需要 ID 列表以确保所有条件(键值)对它们都为真。
【解决方案2】:

您正在混合过滤和选择。列出要在 SELECT 列表中显示的列以及用于在 WHERE 子句中过滤的列

SELECT key, value
FROM my_table
WHERE ID = 1 AND key IN ('A1', 'A2')

如果您的表中没有value 列,您可以使用DECODE function

SELECT key, DECODE(key, 'A1', 'o1', 'A2', 'o4', key) AS value
FROM my_table
WHERE ID = 1

key 之后,您必须指定成对的搜索值和结果值。这些对后面可以跟一个默认值。在此示例中,由于我们没有为 'A3' 指定结果,因此结果将是键本身。如果未指定默认值,则缺少搜索值将返回 NULL。


更新

看来我误解了这个问题(请参阅@mathguy 的评论)。您可以通过简单地使用布尔运算符 AND 和 OR 来过滤您想要的方式

SELECT * FROM
FROM my_table
WHERE
    ID = 1 AND
    (
        key = 'A1' AND value ='o1' OR
        key = 'A3' AND value ='o4'
    )

通过使用这种模式,很容易添加更多这种类型的约束。请注意,AND 优先于 OR(例如 * 优先于 +)。

【讨论】:

  • 您似乎很可能误解了这个问题。除此之外,您链接到的保留字列表不是 Oracle SQL 的列表 - 它是用于不同 Oracle 事物的各种关键字的合并。请参阅docs.oracle.com/database/121/SQLRF/ap_keywd.htm#SQLRF022 以获得正确的参考。两个词都没有保留;他们不需要逃脱。 (尽管它们都是关键字,因此将它们用作标识符是一种不好的做法。)
  • 是的,过滤器中的 if then 非常具有误导性。
猜你喜欢
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 2020-04-05
相关资源
最近更新 更多