2017-01-16 24 views
0

Я создал макрос, в котором я соединяюсь с несколькими таблицами, используя макрокоманду в имени таблицы. Таким образом, он будет вызываться для разных значений этой макропеременной и выполняет для них одну и ту же обработку, используя разные имена таблиц (основывайтесь на макрос var). Но для нескольких значений одна из таблиц в соединении может быть несуществующей, тогда я бы не хотел присоединяться к ней.Как выполнить условное соединение (если одна таблица может быть несуществующей)

example : /* example code*/ 
    macro test(cmpnynme,demog,deptt) ; 
    proc sql; 
    create table final as 
    select a.name, 
      b.age, 
      c.dept 
    from dpt_name_&cmpnynme. a 
    inner join demographics_&demog. b on a.dept_id = b.dept_id 
    left outer join depart_&deptt. c on a.dept_id = c.dept_id; 
    quit; 
    %mend; 

    %test(a,b,c); 
    %test(b,e,f); 
    %test(f,g,h); /*Macro calls */ 

Теперь depart_h не существует, поэтому в данном случае я не хочу, чтобы левое соединение произойдет, так как это non_existent стол и возвращает ошибку в третьем вызове макроса. Как решить эту проблему?

ответ

0

Вы можете создать запрос, проверяющий условие и выполнив его с помощью PREPARE stmt3 FROM @QUERY; EXECUTE stmt3; DEALLOCATE PREPARE stmt3; вы можете выполнить запрос запроса, проверяя соответствующие условия.

например.

set @QUERY = ''; 
IF @conditionOne IS TRUE THEN 
SET @QUERY = CONCAT(@QUERY,"left outer join depart_",deptt,". c on a.dept_id = c.dept_id "); 
END IF; 
PREPARE stmt3 FROM @QUERY; 
EXECUTE stmt3; 
DEALLOCATE PREPARE stmt3; 

Вы можете выполнить окончательный запрос с помощью этих инструкций. дайте мне знать, если мне не хватает логики.

+0

Спасибо за ваш ответ, но я думаю, что здесь был написан код T_SQL, это в SAS, поэтому я не совсем понимаю, что сделано в вашем коде. – Rhea

+0

На самом деле его запрос MySql, вы передаете переменные через макросы, не так ли? Мы можем проверить условие от этих переменных и добавить запрос. Наконец, готовый запрос может быть выполнен. Это то, что я хотел показать! –

2

Используйте макро логику для условного генерации последнего предложения LEFT JOIN. Вы можете протестировать, используя функцию EXIST().

%macro test(cmpnynme,demog,deptt) ; 
proc sql; 
    create table final as 
    select a.name 
     , b.age 
     , c.dept 
    from dpt_name_&cmpnynme. a 
    inner join demographics_&demog. b on a.dept_id = b.dept_id 
%if %sysfunc(exist(depart_&deptt)) %then 
    left outer join depart_&deptt. c on a.dept_id = c.dept_id 
; 
    ; 
quit; 
%mend test; 
+0

Спасибо Том, это имеет смысл и дает мне некоторую надежду, но в моем фактическом запросе у меня есть предложение where после этих операторов объединения, поэтому я не могу поместить точку с запятой в оператор соединения, и в противном случае это дает мне ошибку. – Rhea

+0

Пожалуйста, проигнорируйте мой комментарий выше, он работал как PRO, спасибо Tom !! – Rhea

+0

Первый ';' заканчивает оператор '% IF', а второй завершает оператор' create'. Если у вас есть предложение 'where' или' order by', поместите их перед ';', который завершает оператор 'create'. – Tom

 Смежные вопросы

  • Нет связанных вопросов^_^