另一个值条件中的“案例”

时间:2019-09-18 16:30:59

标签: sql oracle

我正在尝试在另一个CASE表达式中执行一个CASE。实际上,情况是:

 (SELECT cmp_tubo 
 FROM qt_qts.res_tubo_serra
 WHERE res_tubo_serra.cod_ordem_producao = ro.cod_ordem_producao AND res_tubo_serra.idc_tubo = ro.idc_tubo
 AND res_tubo_serra.idc_serra != 0
 ) AS cmp_corte_ponta

我需要什么:

如果“ cmp_corte_ponta”的值= 0,那么我将需要执行此搜索并替换“ cmp_corte_ponta”的值:

   Select 
    (CASE serra.tip_corte
     WHEN '1'   THEN to_char(SERRA.CMP_CORTE)
     ELSE 'NO'
     END
    ) cmp_corte_ponta
    from fl_qts.res_tubo_serra_feixe serra

如果“ cmp_corte_ponta”的值= 0,则该值必须仍然相同。

我应该使用哪种语法?

谢谢!

*编辑代码*

select 
  pla.cod_pedido,
  pla.cod_aqa,

 coalesce (
 NULLIF(
 (SELECT cmp_tubo 
            FROM qt_qts.res_tubo_serra
            WHERE res_tubo_serra.cod_ordem_producao = ro.cod_ordem_producao
                AND res_tubo_serra.idc_tubo = ro.idc_tubo
                AND res_tubo_serra.idc_serra != 0)
    , 0),
    (SELECT
        (CASE serra.tip_corte
             WHEN '1'   THEN SERRA.CMP_CORTE
             ELSE 0
        END)
    FROM fl_qts.res_tubo_serra_feixe serra)) as cmp_corte_ponta,

  pla.another_collum
 FROM qt_qts.res_tubo_secao_od ro...

现在的错误是:

“ ORA-01427-“单行子查询返回多个行”。

2 个答案:

答案 0 :(得分:1)

原始,但弄乱了数据类型:

SELECT COALESCE(
    NULLIF(
        (SELECT cmp_tubo 
            FROM qt_qts.res_tubo_serra
            WHERE res_tubo_serra.cod_ordem_producao = ro.cod_ordem_producao
                AND res_tubo_serra.idc_tubo = ro.idc_tubo
                AND res_tubo_serra.idc_serra != 0)
    , 0),
    SELECT
        (CASE serra.tip_corte
             WHEN '1'   THEN to_char(SERRA.CMP_CORTE)
             ELSE 'NO'
        END) cmp_corte_ponta
    FROM fl_qts.res_tubo_serra_feixe serra
)

编辑已更正的数据类型。 NULLIF()COALESCE()都需要所有参数类型都相同(可能会发生强制转换):

SELECT COALESCE(
    NULLIF(
        (SELECT to_char(cmp_tubo)
            FROM qt_qts.res_tubo_serra
            WHERE res_tubo_serra.cod_ordem_producao = ro.cod_ordem_producao
                AND res_tubo_serra.idc_tubo = ro.idc_tubo
                AND res_tubo_serra.idc_serra != 0)
    , '0'),
    SELECT
        (CASE serra.tip_corte
             WHEN '1'   THEN to_char(SERRA.CMP_CORTE)
             ELSE 'NO'
        END) cmp_corte_ponta
    FROM fl_qts.res_tubo_serra_feixe serra
)

答案 1 :(得分:0)

鉴于您要处理的值很少,我可能会尝试一些嵌套的解码语句:

 (SELECT decode(cmp_tubo, 
                0, (SELECT decode(serra.tip_corte, 
                                  '1', to_char(serra.cmp_corte),
                                  'NO')
                    FROM fl_qts.res_tubo_serra_feixe serra),
                cmp_tubo)
 FROM qt_qts.res_tubo_serra
 WHERE res_tubo_serra.cod_ordem_producao = ro.cod_ordem_producao AND res_tubo_serra.idc_tubo = ro.idc_tubo
 AND res_tubo_serra.idc_serra != 0
 ) AS cmp_corte_ponta