Укажите несколько альтернативных условий соединения, используя условное выражение с SQLAlchemy

#python #sql #sqlalchemy

#python #sql #sqlalchemy

Вопрос:

Я соединяю две таблицы в SQLAlchemy. Если выполняется определенное условие, я хочу присоединиться к столбцу ‘C’ в правой таблице, в противном случае я хочу присоединиться к столбцу ‘D’ в правой таблице.

В raw SQL я бы использовал оператор CASE. Я пытался реализовать это в SQLAlchemy, но получил эту ошибку:

Ошибка типа: объект ‘bool’ не может быть повторен

Вот как я бы написал инструкцию в необработанном SQL:

 SELECT 
t1.A, 
t2.B
FROM t1
JOIN t2 ON CASE
    WHEN t2.E = '1' THEN t2.C
    ELSE t2.D
END LIKE t1.CD || %
  

И как я пытался написать это в SQLAlchemy:

 select([t1.columns.A, t2.columns.B]).select_from(
   t1.join(t2, case([t2.columns.E == '1', t2.columns.C], 
   else_=t2.columns.D).like(t1.columns.CD   '%')))
  

Ответ №1:

Синтаксис моего оператора case был неправильным. Условием должен быть кортеж, заключенный в квадратные скобки. Вместо:

 case([t2.columns.E == '1', t2.columns.C], else_=t2.columns.D)
  

Это должно быть:

 case([(t2.columns.E == '1', t2.columns.C)],  else_=t2.columns.D)
  

Ответ №2:

Я не думаю, что вы можете выполнить оператор like в качестве условия соединения. Вы можете выполнить декартово произведение join и выполнить оператор where с like в нем.

 SELECT t1.A, t2.B
FROM t1, t2
where CASE WHEN t2.E = '1' THEN t2.C ELSE t2.D END LIKE t1.CD||'%'
  

Комментарии:

1. Мой необработанный SQL работает нормально. Я ищу решение в SQLAlchemy.