1

我是新手,Oracle并且对MS SQL. 我正在尝试根据user_idfrom获取电话号码Table2,这是业务逻辑:

  • 案例1:如果找到一个匹配项,Table1则从中获取相应的免费电话号码Table2

  • 案例2:如果未找到匹配项,Table1则从以下获取默认免费电话号码Table2

  • 案例3:如果找到多个匹配项,Table1则所有这些都从order by or中assigned_care_levels获取Care值,然后选择第一行电话号码。Table2ascdesc

我编写了以下查询,当我单独运行它时效果很好。但是,当我使用 if else 语句结合它时,我收到以下错误ERROR: ORA-00907: missing right parenthesis。这是我的代码:

if ((select count(distinct care_level) from Table1 where user_id = '100') > 0)
    select phone from Table2 where care_level in (select distinct care_level from Table1 where user_id = '100')
    and rownum = 1 
    order by care_level asc
else if((select count(distinct care_level) from Table1 where user_id = '100') = 0)
    select phone from Table2 where care_level = 'default'
4

2 回答 2

0
SET SERVEROUTPUT ON;

DECLARE
       v_CARE_COUNT NUMBER := 0;
       v_PHONE VARCHAr2(40) := NULL;
BEGIN
      select  count(distinct care_level) 
         into v_CARE_COUNT
      from Table1 
       where user_id = '100';

      IF(v_CARE_COUNT > 0) THEN

         select phone into v_PHONE 
         from Table2 
         where care_level in 
           (select distinct care_level from Table1 where user_id = '100')
         and rownum = 1;
      ELSE
         select phone into v_PHONE
          from Table2
         where care_level = 'default';
      END IF;
      DBMS_OUTPUT.PUT_LINE('PHONE is <'||v_PHONE||'>');
 EXCEPTION
 WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('Exception : '||SQLERRM);
 END;
 /

编辑:(作为单一 SQL)

 SELECT PHONE 
 FROM TABLE2
 WHERE CARE_LEVEL in
       (
          SELECT CARE_LEVEL FROM TABLE1 WHERE USER_ID='100'
           UNION
          SELECT CARE_LEVEL FROM TABLE1 WHERE CARE_LEVEL='default'
            AND NOT EXISTS
              (SELECT 'X' FROM TABLE1 WHERE USER_ID='100')
        )
 AND ROWNUM = 1;
于 2013-12-20T22:05:59.537 回答
0

'else if' 语法是错误的。在 Oracle 中,您需要使用“ELSIF”并使用“END IF”完成整个条件语句。里面的 SQL 语句也应该跟一个 ;

尝试:

IF ((select count(distinct care_level) from Table1 where user_id = '100') > 0) THEN
    select phone from Table2 where care_level in (select distinct care_level from Table1 where user_id = '100')
    and rownum = 1 
    order by care_level asc;
ELSIF ((select count(distinct care_level) from Table1 where user_id = '100') = 0) THEN
    select phone from Table2 where care_level = 'default'; END IF
于 2013-12-20T22:23:13.967 回答