【问题标题】:Oracle SQL nested case with SELECT returns single-row subquery returns more than one row带有 SELECT 的 Oracle SQL 嵌套案例返回单行子查询返回多行
【发布时间】:2019-12-28 04:16:20
【问题描述】:

我试图在嵌套情况下从 abcdef 表中检索值,我在 SELECTS MENTIONED 中得到“单行子查询返回多行”错误 ---- 此处出现错误。 情况1:当colC值在NOT NULL并且没有值('LM','OP','QR')时,当colD为NULL时colD值在'00'和'99'之间 情况 2:当 colC 值在 NOT NULL 并且确实有值('LM','OP','QR')时,当 colD 为 NULL 时返回该行或当 colE 为 null 时返回该行

如何重写此查询以获得正确的结果

Table abcdef
colfKEY | colA | colB | colC | colD | colE

Table maintable
colPKEY | colTemp

select 
a.colA , a.colB, a.colC,
CASE  
    WHEN a.colC IS NULL THEN ''    
    WHEN a.colC IS NOT NULL THEN 
       (CASE  
         WHEN  (a.colC NOT IN ('LM','OP','QR')) THEN
          (CASE WHEN (a.colD IS NULL) THEN 
            (SELECT T.colD FROM abcdef T where T.colD IS NULL)   ---- error here
          WHEN TT.colD IS NOT NULL THEN 
           (SELECT TT.colD from abcdef TT WHERE (TT.colD < '00') OR (TT.colD  > '99') )  ---- error here 
          END)

        WHEN (a.colC  IN ('LM','OP','QR')) THEN
       (CASE WHEN a.colD IS NULL THEN 
             (SELECT a.colD FROM abcdef a) ---- error here
         WHEN a.colE IS NULL THEN 
            (SELECT a.colE FROM abcdef a) ---- error here
        END )
        END)
END
from abcdef a where
a.colfKEY IN
(SELECT m.colPKEY FROM maintable m where 
m.colTemp= '999999');

【问题讨论】:

  • 您的子查询返回超过 1 条记录。如果您对子查询中的任何记录都满意,请在 where 子句中尝试 and rownum=1

标签: sql oracle select case


【解决方案1】:

重写不带子查询的查询:

SELECT a.colA,
       a.colB,
       a.colC,
       CASE
         WHEN a.colC IS NULL THEN
          ''
         WHEN a.colC IS NOT NULL THEN
          (CASE
            WHEN (a.colC NOT IN ('LM', 'OP', 'QR')) THEN
             (CASE
               WHEN (a.colD IS NULL) THEN
                     a.colD
               WHEN a.colD IS NOT NULL AND ((a.colD < '00') OR (a.colD > '99')) THEN
                    a.colD
             END)

            WHEN (a.colC IN ('LM', 'OP', 'QR')) THEN
             (CASE
               WHEN a.colD IS NULL THEN
                    a.colD 
               WHEN a.colE IS NULL THEN
                    a.colE 
             END)
          END)
       END
  FROM abcdef a
  JOIN maintable m 
    ON a.colfKEY = m.colPKEY 
 WHERE m.colTemp = '999999';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多