#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.