【问题标题】:case statement if table present表存在时的 case 语句
【发布时间】:2015-02-27 09:49:55
【问题描述】:

我在从不同的数据库中查找表时遇到问题(表有时会由于过程而被删除)如果该表存在则条件 else direct ans as 1

select (case when exists (select * from SysSet.INFORMATION_SCHEMA .TABLES where TABLE_NAME = 'CHQPASS') then ( left(tranm.docu_no,1) '3' 或 tranm.docu_dt 的情况 当(从 TRAND k 中选择前 1 个 ACHD_KEY 其中 k.TRN_NO = TRANM.TRN_NO 和 k.DR_CR ='D')='A000100010002' THEN 1 WHEN(从 SYSSET..chqpass D 中选择 COUNT(*),其中 D.COMP_DIR ='PSAGR' and D.DOCU_DT = TRANM.DOCU_DT and D.AMT = TRAND.TOT_AMT) 0 那么 1 else cast(isnull (trand.RECONCILE,0)as int) 结尾) 其他 1
结束)作为挂起

如果表格不存在,则显示错误

消息 208,级别 16,状态 1,行 2 无效的对象名称 'SYSSET..chqpass'。

表不存在我如何阻止它查看该表

【问题讨论】:

  • 哪个 DBMS mysql 或 sql server ?
  • 您是否有一个名为SYSSET 的数据库,因为dbo 架构中应该有表chqpass
  • 删除了 mysql 标签,因为错误消息清楚地表明它是 sql server
  • 编辑您的问题,而不是添加代码 cmets。
  • 它的 sql server 我有 sysset 数据库(chqpass 表由于过程而被删除,但我希望该表不存在,那么 ans 应该是一个)

标签: sql sql-server


【解决方案1】:

以下行替换

WHEN  (select COUNT(*) from SYSSET..chqpass  D where D.COMP_DIR ='xyz' and D.DOCU_DT >'01/01/2015' and D.AMT = 2556 ) <> 0 

用这条线

WHEN  EXEC('(select COUNT(*) from SYSSET..chqpass  D where D.COMP_DIR =''xyz'' and D.DOCU_DT >''01/01/2015'' and D.AMT = 2556 )') <> 0 

它应该这样工作......

【讨论】:

  • 它首先起作用了我试过只有它首先在表中查找,因为它不存在并显示错误
  • 好的,你能试着把完整的查询放在'EXEC'中吗?
【解决方案2】:

试试这个尝试用INformationschema 替换sys.tables,这样您就可以指定该表存在于哪个schema

SELECT 
     (
       CASE WHEN EXISTS(SELECT * FROM SYSSET.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'CHQPASS' AND TABLE_SCHEMA = 'dbo')
             THEN (
                   CASE WHEN LEFT(tranm.docu_no,1) <>'3' or tranm.docu_dt < '01/01/2015' THEN 1  
                        WHEN (SELECT TOP 1 ACHD_KEY FROM TRAND k WHERE k.TRN_NO = TRANM.TRN_NO and k.DR_CR ='D' ) = 'A000100010002' THEN 1 
                        WHEN  (select COUNT(*) from SYSSET..chqpass  D WHERE D.COMP_DIR ='PSAGR' and D.DOCU_DT = TRANM.DOCU_DT and D.AMT = TRAND.TOT_AMT ) <> 0  THEN 1 
                        ELSE cast(isnull (trand.RECONCILE,0)as int)
                   END
                  )
      ELSE 1  
      END 
     ) as pend 

【讨论】:

  • 很抱歉,但这很重要 :( 是否必须拥有该表(如果该表存在,它可以正常工作)而不存在则抛出该表不存在的错误
  • 您使用的是哪个 sql server ?你只运行这部分查询吗?或者查询还有更多内容??
  • 这是一个大查询,我使用的是 sqlserver 2008(你可以说是我一生中最大的查询)
  • 我已经用我的表名测试了上面的查询,它在这里工作正确可能是查询的其他部分有问题你能发布你的完整查询吗?
  • 我已经贴出来了,请看一下可能其他地方有问题
猜你喜欢
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 2022-01-22
  • 2011-03-22
  • 1970-01-01
  • 2018-12-25
  • 2023-04-07
  • 2016-07-31
相关资源
最近更新 更多