【问题标题】:Replace not matching values with sub query in pl/sql用 pl/sql 中的子查询替换不匹配的值
【发布时间】:2026-02-18 12:15:01
【问题描述】:

考虑下表


SELECT QUEUENAME, 
       PRIORITY 
  FROM QUEUES 
 WHERE QUEUENAME IN ('Windows','Macintosh')

从上面的查询和表值来看,没有QueueName 作为“Macintosh”。因此,我希望只要 where 子句中没有匹配的值,就应该选择一个带有 QueueName "Unknown" 的值并获取它的值。

请告诉我如何实现这个查询?

我正在寻找的输出是

| QUEUENAME | PRIORITY |
|-----------|----------|
|   Windows |        1 |
|   Unknown |        3 |

【问题讨论】:

  • 您使用的是哪个 DBMS?您使用 MySQL 和 SQL Server 标记了您的问题,但您提到了 PL/SQL,这是 Oracle 用于存储过程的语言,但您没有显示任何过程代码。

标签: mysql sql sql-server oracle


【解决方案1】:

这是一个查询

select * from queues where queuename in ('Windows','Macintosh')
UNION ALL
select * from queues where queuename in 
(
select decode
(
(
select count(queuename) from queues 
where queuename NOT IN  ('Windows','Macintosh')
),1,NULL,'Unknown')
queuename from queues where queuename NOT in ('Windows','Macintosh'))

查询给出了您的预期结果

如果你给 windows Macintosh 它给 windows unknown。 如果你给 linux macintosh 它给 linux unknown 如果你给windows unknown 它给windows unknown 如果你给 Linux unknown 它给 linux unknown 如果你给 linux windows 它给 linux windows

我只在过去 4 个月内为 oracle 编写代码,所以一些有经验的人可以提供比这更简单的代码...

你必须在 3 个地方给出位置

【讨论】:

    【解决方案2】:

    已更新您是否正在寻找类似的内容?

    SELECT COALESCE(q.queuename, q2.queuename) queuename,
           COALESCE(q.priority, q2.priority) priority
      FROM 
    (
      SELECT 'Windows' queuename FROM dual
      UNION ALL
      SELECT 'Macintosh' FROM dual
    ) s LEFT JOIN queues q
        ON s.queuename = q.queuename JOIN queues q2
        ON q2.queuename = 'Unknown'
    

    输出:

    |队列名 |优先级 | |-----------|----------| |窗户 | 1 | |未知 | 3 |

    这里是 SQLFiddle 演示 (Oracle)
    这是SQLFiddle演示(SQL Server)

    【讨论】:

    • 我相信他期望队列名在不匹配时应该返回未知行他期望他的结果显示 Unknown 3 而不是 Macintosh 3。如果我错了,请纠正我......
    • @peterm 您的帖子很有用,但仍然与我的输出不匹配。
    • @KashifKhan 您想要的输出在您发布之前并不清楚。使用固定查询查看更新的答案。
    • @KashifKhan 到底有没有帮助?
    【解决方案3】:
    create table queues as
    select 'Windows' as queuename, 1 as priority from dual union all
    select 'Linux'   as queuename, 2 as priority from dual union all
    select 'Unknown' as queuename, 3 as priority from dual
    ;
    
    with data_(qname) as (
    select 'Windows'   from dual union all
    select 'Macintosh' from dual
    )
    select coalesce(queues.queuename, default_.queuename) as queuename,
           coalesce(queues.priority, default_.priority) as priority
    from data_
    left outer join queues on queues.queuename = data_.qname
    inner join queues default_ on default_.queuename = 'Unknown'
    ;
    
    QUEUENA   PRIORITY
    ------- ----------
    Windows      1
    Unknown      3
    

    【讨论】:

    • 此答案适用于 Oracle (11g)。我很慢......但我在第一枪就成功了:)