【问题标题】:sqlalchemy concat with more than 2 elements on Oracle DBsqlalchemy concat 在 Oracle DB 上有超过 2 个元素
【发布时间】:2020-01-27 08:53:26
【问题描述】:

考虑下表定义

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 创建查询或使用 sqlalchemy 为这种情况创建更具可读性的 sql 查询

【问题讨论】:

    标签: python sql oracle sqlalchemy concat


    【解决方案1】:

    要创建一个有超过 2 个参数的 concat,可以使用 + 运算符:

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

    导致像这样的|| 连接查询

    select c_id || '-' || class_code from t
    

    【讨论】:

    • 为了记录,这个答案在sqlite上也有效。
    【解决方案2】:

    在 Oracle 中,CONACT 函数只接受 2 个值。

    使用|| 连接任意数量的列很容易,如下所示:

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

    干杯!!

    【讨论】:

    • 感谢您的回答。我的意思是如何在 pyhton 中使用 sqlalchemy 创建一个像你这样的语句。我澄清了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2013-05-10
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2011-09-27
    • 1970-01-01
    • 2014-06-29
    相关资源
    最近更新 更多