将 case 子句与连接语句一起使用 sql

using case clause with join statement sql

我有以下查询:

select * from isg.tdbFutures f, isg.tdbOption e 
    where 
        f.contract = 306121 and
        e.underlier = f.entityID

哪个 return 这个:

 entityID     lastTradeDate     expiration     firstTradeDate     contract     lastTradeDate     underlier     isPut     expiration     strike     entityID     optionMetricsID     expirationCycle    
 -----------  ----------------  -------------  -----------------  -----------  ----------------  ------------  --------  -------------  ---------  -----------  ------------------  ------------------ 
 311320       3/1/2018          3/1/2018       6/22/2017          306123       12/22/2017        311320        false     12/22/2017     100        368145       0                   monthly            
 311320       3/1/2018          3/1/2018       6/22/2017          306123       12/22/2017        311320        false     12/22/2017     106        368146       0                   monthly            
 311320       3/1/2018          3/1/2018       6/22/2017          306123       12/22/2017        311320        false     12/22/2017     120        368147       0                   monthly  

我想构建一个字符串以插入另一个 table,以 isPut 列为条件。这是我的尝试:

select * from isg.tdbFutures f, isg.tdbOption e 
     where 
        f.contract = 306123 and
        e.underlier = f.entityID
     CASE isPut
        WHEN false THEN 'FI_US_M Call'
        WHEN true THEN 'FI_US_M Put'
     END

但是,我收到以下错误:

>[Error] Script lines: 45-52 ------------------------
 SQL Anywhere Error -131: Syntax error near 'false' on line 6
 Msg: 102, Level: 15, State: 0
 Line: 0 

我要插入的 table,其中 category 是我的条件字符串,entityID 是我的 f.contract 值:

 category           entityID    
 -----------------  ----------- 
 US Equity          66281       
 US Fixed Income    66283       
 AUD                66359  

正如@GordonLinoff 指出的那样,它不应该是这样的:

select 
    *,
    CASE isPut
       WHEN false THEN 'FI_US_M Call'
       WHEN true THEN 'FI_US_M Put'
    END as my_new_column
   from isg.tdbFutures f, isg.tdbOption e 
   where 
        f.contract = 306123 and
        e.underlier = f.entityID

我想你想要这个

select * 来自 isg.tdbFutures f, isg.tdbOption e , 案件 当 isPut = false THEN 'FI_US_M Call' 否则 'FI_US_M Put' 结束 在哪里 f.contract = 306123 和 e.underlier = f.entityID

如果要插入另一个table,不应该是这样吗?

insert new_column_from_case = CASE isPut WHEN false THEN 'FI_US_M Call'
                                         WHEN true THEN 'FI_US_M Put'
                                         END
       new_f_contract = f.contract
  into another_table
  from isg.tdbFutures f, isg.tdbOption e 
 where f.contract = 306123 
   and e.underlier = f.entityID

您似乎想要的查询是:

select f.*, o.*,
       (case when isPut then 'FI_US_M Put'
             else 'FI_US_M Call'
        end) as new_column
from isg.tdbFutures f join
     isg.tdbOption o 
     on o.underlier = f.entityID
where f.contract = 306123;

备注:

  • 学习使用正确、明确的标准JOIN语法。 从不FROM 子句中使用逗号。
  • 作为最佳实践,您应该列出 select 中的所有列。
  • Table别名应该是table名字的缩写,所以我把e改成了o.
  • case表达式属于select.
  • -