sqlalchemy concat с более чем 2 элементами на Oracle DB - PullRequest
0 голосов
/ 27 января 2020

с учетом следующего определения таблицы

meta = MetaData()

tgd = Table('T_GROUP_DAT', meta,
            Column('C_ID'),
            Column('CLASS_CODE'))

Я создаю оператор выбора, используя sqlalchemy.sql.functions.concat с 3 операторами

tgd_q1 = select([functions.concat(tgd.c.C_ID, '-', tgd.c.CLASS_CODE)])

, используя

tgd_q1.compile(dialect=OracleDialect(), compile_kwargs={"literal_binds": True}))

запрос

SELECT concat("T_GROUP_DAT"."C_ID", "T_GROUP_DAT"."CLASS_CODE") AS concat_1
FROM "T_GROUP_DAT"

сформирован. Однако, когда я запускаю это, возникает исключение ORA-00909: invalid number of arguments. Это потому, что CONCAT (https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions026.htm) допускает только 2 аргумента.

В настоящее время мой обходной путь - использовать concat внутри concat, что работает

tgd_q1 = select([functions.concat(functions.concat(tgd.c.C_ID,'-'),tgd.c.CLASS_CODE)])

Однако это делает результирующий запрос sql гораздо менее читабельным. Есть ли способ создать запрос с использованием | oparator или создать более читабельный запрос sql для этого случая с использованием sqlalchemy

Ответы [ 2 ]

1 голос
/ 27 января 2020

Для создания конкатата с более чем 2 параметрами можно использовать оператор +:

tgd_q1 = select([tgd.c.C_ID + '-' + tgd.c.CLASS_CODE])

, что приводит к || связанному запросу, подобному этому

select c_id || '-' || class_code from t
0 голосов
/ 27 января 2020

In Oracle, CONACT Функция принимает только 2 значения.

Простое использование || позволяет объединить любое число столбцов следующим образом:

select col1 || ' ' || col2 || ' ' || col3 ...
from your_table;

Ура !!

...