использование предложения case с оператором соединения sql - PullRequest
0 голосов
/ 27 сентября 2018

У меня следующий запрос:

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

, который будет возвращать это:

 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  

Я хочу построить строку для вставки в другую таблицу, обусловленную столбцом 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 

Таблица, которую я смотрю, чтобы вставить, где category - строка из моего условного иentityID - это мое f.contract значение:

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

Ответы [ 4 ]

0 голосов
/ 27 сентября 2018

Похоже, что вам нужен запрос:

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;

Примечания:

  • Научитесь использовать правильный, явный синтаксис standard JOIN, Никогда не используйте запятые в предложении FROM.
  • Рекомендуется перечислить все столбцы в select.
  • Псевдонимы таблицы должны бытьсокращения для названия таблицы, поэтому я изменил e на o.
  • case выражение принадлежит select.
0 голосов
/ 27 сентября 2018

Я думаю, что вы хотите это

select * from isg.tdbFutures f, isg.tdbOption e, CASE WHENe.underlier = f.entityID

0 голосов
/ 27 сентября 2018

Если вы хотите вставить в другую таблицу, разве не должно быть что-то подобное?

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
0 голосов
/ 27 сентября 2018

Как указывает @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
...