mysql中大多数函数无法在Postgres中使用,语法也有差异。以下记录不兼容点与修复方法。
一、语法差异与修复
1、mysql支持 insert into() value()写法。postgres不支持。必须使用values
2、mysql中防止字段与关键字冲突的`在postgres中无法被识别。需要把`替换为"。
3、mysql中表字段名可以自由设定大小写,而postgres中所有字段名都会被强制转为小写。虽然日常使用sql语句查询时大小写不敏感。但在使用"符号标注字段时则会大小写敏感。若使用大写则会导致无法找到对应字段。这点会影响Mybatis。当在程序中使用@TableField和@TableId注解时。若大小写不一致会导致程序报错。
4、mysql8之前对group by关键字没有做强制要求。所以会出现查询多字段时使用group by根据单字段去重。这个写法在Postgres中报错。可以使用 distinct on()进行去重。用此方法时可以配合order by指定字段排序,取第一条数据。
5、mysql中limit语法为 limit {offset},{size},在postgres中需要改为limit {size} offset{offset}
二、函数差异与替代方法
1、ifnull函数无法使用。可以使用COALESCE()函数。此函数会返回参数中首个不为null的函数。
2、if()函数无法使用。可以使用CASE WHEN函数替代。
3、date_sub()函数无法使用。postgres可以直接使用加减号计算。
4、date_diff()函数无法使用。可以使用date_part('day','startdate-enddate')函数。
5、date_format()函数无法使用,可以使用to_char ()函数,同时格式变为yyyymmdd
6、sysdate()无法使用,改为now()
7、find_in_set()无法使用。替换为ANY(string_to_array(column,','))
8、group_concat无法使用,替换为array_to_string(array_agg(t.cname),',') 或 string_agg(t.cname,',')