首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >10级以上的SQL CASE语句

10级以上的SQL CASE语句
EN

Stack Overflow用户
提问于 2022-10-21 16:57:20
回答 2查看 54关注 0票数 0

我不太懂SQL编程语言。我正在用SQL做一个改变视图的项目,我需要在10个级别以上嵌套一个CASE语句。这是我的密码。

代码语言:javascript
复制
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


ALTER view [dbo].[AO_VW_CONSULTA_CONTABIL_ATIVO_V3] as 
 SELECT  T.TPCODPRD, T.TPDESCR,
         E.EXCTADB, E.EXCTACR, E.EXCODHIS, E.EXCODAGE,
         E.EXNROPER, E.EXNRPARC, E.EXCNTRL, E.EXVLRMOV,
         E.EXRELATO, E.EXUSUARIO, E.EXNRBOL, E.EXCODCCUS,
         E.EXTPLNC, C.CLNOMECLI, E.EXDTMOV AS DATAMOV,
         O.OPCODPROD, O.OPCODCNV AS CODIGO,
 CASE 
 WHEN O.OPCODPROD = '000001' THEN 'CDC-CONSIGNACOES'
 WHEN O.OPCODPROD = '000002' THEN 'CDC-FINANCIAMENTOS'
 WHEN O.OPCODPROD = '000003' THEN 'MICROCREDITO' 
 WHEN O.OPCODPROD = '000004' THEN 'CDC-CONSIGNACAO INSS'
 WHEN O.OPCODPROD = '000006' THEN 'CDC - REFINANCIAMENT' 
 WHEN O.OPCODPROD = '000008' THEN 'CDC - RENEGOCIAۂO' 
 WHEN O.OPCODPROD = '000009' THEN 'CDC - RENEG BOLETO' 
 WHEN O.OPCODPROD = '000010' THEN 'CDC-CONSIG SABEMI' 
 WHEN O.OPCODPROD = '000011' THEN 'CDC - REFIN INSS' 
 WHEN O.OPCODPROD = '000012' THEN 'CDC-CONS AUT' 
 WHEN O.OPCODPROD = '000015' THEN 'CDC-CONSIGNACOES' 
 WHEN O.OPCODPROD = '000016' THEN 'REFIN MICROCREDITO' 
 WHEN O.OPCODPROD = '000017' THEN 'CDC-COMPRA DIV INSS'
 WHEN O.OPCODPROD = '000021' THEN 'OP DFV'
 WHEN O.OPCODPROD = '000022' THEN 'CDC-CONSI PRIVADO'
 WHEN O.OPCODPROD = '000023' THEN 'CDC - REFIN PRIVADO'
 WHEN O.OPCODPROD = '000024' THEN 'MULTIPLAS LIBERAÇÕES'
 WHEN O.OPCODPROD = '000025' THEN 'PORTABILIDADE' 
 WHEN O.OPCODPROD = '000026' THEN 'REFINANCIAMENTO MULT. LIBERAÇÕES'
 ELSE 'PRODUTO NÃO RECONHECIDO' END AS DESCRICAO

 FROM 
 dbh.FI_AT_ATIVO.dbo.ECONT E WITH(NOLOCK)
 JOIN  dbh.FI_AT_ATIVO.dbo.COPER O WITH(NOLOCK) ON E.EXNROPER = O.OPNROPER 
 JOIN  dbh.FI_AT_ATIVO.dbo.CCLIE C WITH(NOLOCK) ON O.OPCODCLI = C.CLCODCLI
 JOIN  dbh.FI_AT_aTIVO.DBO.VIEW_TPROD T WITH(NOLOCK) ON O.OPCODPROD = T.TPCODPRD
 WHERE 
  E.EXCTADB <> E.EXCTACR
  AND ( E.EXCTADB like '7.%' OR E.EXCTADB like '8.%' OR E.EXCTACR like '7.%' OR E.EXCTACR like '8.%' )
  AND E.EXRELATO IN ('01','03','04','02','05','06','07','08','09','10','11','12','13','14','15') 

GO

当我执行时,它并不表示有错误,但是当我选择顶部1000头来可视化视图时,它给了我一条消息:"case语句只能嵌套到级别10“。

有人能向我解释一下为什么会发生这种事吗?因为在这个项目之前,我曾经尝试过用超过10个级别来做一个案例陈述,它起了作用。

EN

回答 2

Stack Overflow用户

发布于 2022-10-21 17:07:03

错误消息很奇怪,因为您的CASE表达式不是嵌套的。好吧,也许DBMS在场景中把他们藏起来了。您可能可以使用另一种形式的CASE表达式(CASE value WHEN ... THEN ... WHEN ... THEN ... ELSE ... END )来规避这一问题。

代码语言:javascript
复制
CASE O.opcodprod
  WHEN '000001' THEN 'CDC-CONSIGNACOES'
  WHEN '000002' THEN 'CDC-FINANCIAMENTOS'
  WHEN '000003' THEN 'MICROCREDITO' 
  WHEN '000004' THEN 'CDC-CONSIGNACAO INSS'
  WHEN '000006' THEN 'CDC - REFINANCIAMENT' 
  WHEN '000008' THEN 'CDC - RENEGOCIAۂO' 
  WHEN '000009' THEN 'CDC - RENEG BOLETO' 
  WHEN '000010' THEN 'CDC-CONSIG SABEMI' 
  WHEN '000011' THEN 'CDC - REFIN INSS' 
  WHEN '000012' THEN 'CDC-CONS AUT' 
  WHEN '000015' THEN 'CDC-CONSIGNACOES' 
  WHEN '000016' THEN 'REFIN MICROCREDITO' 
  WHEN '000017' THEN 'CDC-COMPRA DIV INSS'
  WHEN '000021' THEN 'OP DFV'
  WHEN '000022' THEN 'CDC-CONSI PRIVADO'
  WHEN '000023' THEN 'CDC - REFIN PRIVADO'
  WHEN '000024' THEN 'MULTIPLAS LIBERAÇÕES'
  WHEN '000025' THEN 'PORTABILIDADE' 
  WHEN '000026' THEN 'REFINANCIAMENTO MULT. LIBERAÇÕES'
  ELSE 'PRODUTO NÃO RECONHECIDO'
END AS descricao

另一种解决方案,我更喜欢的方案,是有一个表,为代码和描述,您可以简单地加入。

票数 1
EN

Stack Overflow用户

发布于 2022-10-21 22:37:19

我同意其他人在关于这个问题的评论中所表达的观点,即这些映射确实应该存储在数据库中的第一类表中。也就是说,这应该是解决你的问题的一个方法:

代码语言:javascript
复制
SELECT  T.TPCODPRD, T.TPDESCR,
         E.EXCTADB, E.EXCTACR, E.EXCODHIS, E.EXCODAGE,
         E.EXNROPER, E.EXNRPARC, E.EXCNTRL, E.EXVLRMOV,
         E.EXRELATO, E.EXUSUARIO, E.EXNRBOL, E.EXCODCCUS,
         E.EXTPLNC, C.CLNOMECLI, E.EXDTMOV AS DATAMOV,
         O.OPCODPROD, O.OPCODCNV AS CODIGO,
         COALESCE(mapping.DESCRICAO, 'PRODUTO NÃO RECONHECIDO')
 FROM 
 dbh.FI_AT_ATIVO.dbo.ECONT E WITH(NOLOCK)
 JOIN  dbh.FI_AT_ATIVO.dbo.COPER O WITH(NOLOCK) ON E.EXNROPER = O.OPNROPER 
 JOIN  dbh.FI_AT_ATIVO.dbo.CCLIE C WITH(NOLOCK) ON O.OPCODCLI = C.CLCODCLI
 JOIN  dbh.FI_AT_aTIVO.DBO.VIEW_TPROD T WITH(NOLOCK) ON O.OPCODPROD = T.TPCODPRD
 
 outer apply (
    select DESCRICAO from (values
        ('000001', 'CDC-CONSIGNACOES'),
        ('000002', 'CDC-FINANCIAMENTOS'),
        ('000003', 'MICROCREDITO' ),
        ('000004', 'CDC-CONSIGNACAO INSS'),
        ('000006', 'CDC - REFINANCIAMENT' ),
        ('000008', 'CDC - RENEGOCIAۂO' ),
        ('000009', 'CDC - RENEG BOLETO' ),
        ('000010', 'CDC-CONSIG SABEMI' ),
        ('000011', 'CDC - REFIN INSS' ),
        ('000012', 'CDC-CONS AUT' ),
        ('000015', 'CDC-CONSIGNACOES' ),
        ('000016', 'REFIN MICROCREDITO' ),
        ('000017', 'CDC-COMPRA DIV INSS'),
        ('000021', 'OP DFV'),
        ('000022', 'CDC-CONSI PRIVADO'),
        ('000023', 'CDC - REFIN PRIVADO'),
        ('000024', 'MULTIPLAS LIBERAÇÕES'),
        ('000025', 'PORTABILIDADE' ),
        ('000026', 'REFINANCIAMENTO MULT. LIBERAÇÕES')
    ) as foobar(OPCODPROD, DESCRICAO)
    where foobar.OPCODPROD = O.OPCODPROD
) as mapping

 WHERE 
  E.EXCTADB <> E.EXCTACR
  AND ( E.EXCTADB like '7.%' OR E.EXCTADB like '8.%' OR E.EXCTACR like '7.%' OR E.EXCTACR like '8.%' )
  AND E.EXRELATO IN ('01','03','04','02','05','06','07','08','09','10','11','12','13','14','15') 

我选择在这里使用outer apply并没有什么特别的原因。同样有效的方法是使用CTE或内联派生表,而不是使用left join

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74156907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档