文档首页/ 数据仓库服务 GaussDB(DWS)/ 故障排除/ 数据库使用/ 业务报错:UNION types %s and %s cannot be matched
更新时间:2024-07-01 GMT+08:00

业务报错:UNION types %s and %s cannot be matched

问题现象

执行union语句时报错:UNION types %s and %s cannot be matched。

原因分析

该报错的原因是UNION的分支中,相同位置的输出列格式类型不同导致。

处理方法

故障构造场景

  1. 使用客户端连接DWS数据库。
  2. 执行以下SQL语句。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    CREATE TABLE t1(a int, b timestamp);
    CREATE TABLE
    CREATE TABLE t2(a int, b text);
    CREATE TABLE
    INSERT INTO t1 select 1, current_date;
    INSERT 0 1
    INSERT INTO t2 select 1, current_date;
    INSERT 0 1
    SELECT * FROM t1 UNION SELECT * FROM t2;
    ERROR:  UNION types timestamp without time zone and text cannot be matched
    LINE 1: SELECT * FROM t1 UNION SELECT * FROM t2;
                                          ^
    

解决办法

  1. 示例中,t1表和t2表在b列上类型不同,导致在UNION操作时出现类型不匹配的报错,应保证UNION各分支相同位置的输出列类型匹配。

    t2表b列是text类型,插入的数据是current_date,在插入时发生了隐式类型转换,所以插入不报错;但是在查询时,不会自动进行隐式转换,因此会报错。

    解决以上问题,需保证UNION各分支的输出列类型匹配,不满足要求时可以对输出列强制类型转化。

    1
    2
    3
    4
    5
    6
    SELECT a,b::text FROM t1 UNION SELECT a,b FROM t2;
     a |          b          
    ---+---------------------
     1 | 2023-02-16
     1 | 2023-02-16 00:00:00
    (2 rows)