Укажите несколько альтернативных условий соединения, используя условное выражение с SQLalchemy - PullRequest
0 голосов
/ 29 марта 2019

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

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

TypeError: объект '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 + '%')))

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Синтаксис моего оператора 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)
0 голосов
/ 29 марта 2019

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

SELECT t1.A, t2.B
FROM t1, t2
where CASE WHEN t2.E = '1' THEN t2.C ELSE t2.D END LIKE t1.CD||'%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...