0


MySQL升级PostgreSQL遇到的常见问题及其解决方案

CRUD问题

选择

  1. id

在的逗号分隔的字符串所表示的数组中的行

如果要将字符串用于连接条件,则需要将字符串转换为适当的整数数组。

  1. Select*from table_name
  2. where id =any(string_to_array(?,',')::int[]);
  1. string_to_array(?, ',')::int[]

这部分代码的作用是将一个逗号分隔的字符串转换为一个整数数组。

  1. ?

是一个占位符,你需要在执行这个查询时提供一个实际的值。例如,如果你提供的值是

  1. '1,2,3'

,那么

  1. string_to_array(?, ',')::int[]

就会返回一个数组

  1. [1, 2, 3]

  1. a.id = ANY(...)

这部分代码的作用是检查

  1. a.id

是否在给定的数组中。如果

  1. a.id

的值在数组中,那么这个

  1. WHERE

条件就会为真,相应的行就会被选中。

所以,整个查询的意思是:从

  1. table_name

表中选择那些

  1. id

在给定的逗号分隔的字符串所表示的数组中的行

int可根据需要,替换为 bigint

timestamp日期与字符串比较

List selectList(@Param(“startTime”) String startTime);

使用::双冒号进行类型转换

  1. <selectid="selectList"resultType="com.entity.UserInfo"parameterType="java.util.List">
  2. SELECT *
  3. from user_info
  4. WHERE
  5. create_time &gt;= #{startTime}::timestamp
  6. and
  7. create_time &lt;= '2020-07-07 16:35:02'
  8. </select>

PS:

#{startTime}::timestamp 可根据需要,替换为 date

timestamp:时间戳,转化后带时分秒

date:日期类型,转化后不带时分秒

字符串与数值类型不匹配无法比较

SQL: SELECT b.* from b_station_charts_field b WHERE station_type = ?

Cause: org.postgresql.util.PSQLException: ERROR: operator does not exist: character varying = integer

这个错误通常是因为在条件中比较了一个字符类型(varchar)的列与一个整数类型的值,导致数据库无法找到对应的操作符。要解决这个问题,可以将条件中的参数值转换为正确的数据类型。

例如,如果要比较的是一个字符类型的列

  1. station_type

和一个整数类型的参数值,可以使用

  1. ::integer

运算符将参数值转换为整数类型,示例代码如下:

  1. SELECT b.*FROM b_station_charts_field b
  2. WHERE station_type = ?::integer;

请注意,以上示例中的

  1. ?

是一个占位符,需要将其替换为实际的参数值。

如果要比较的是一个整数类型的列和一个字符类型的参数值,可以使用

  1. ::varchar

运算符将列的值转换为字符类型,示例代码如下:

  1. SELECT b.*FROM b_station_charts_field b
  2. WHERE station_type::varchar= ?;

同样的,需要将以上示例中的

  1. ?

替换为实际的参数值。

使用字符串类型更新时间戳失败

Cause: org.postgresql.util.PSQLException: ERROR: column “rowmodifytime” is of type timestamp without time zone but expression is of type character varying

在更新 PostgreSQL 数据库时,尝试将一个字符类型的值赋给一个时间戳类型的列,这是不允许的。

需要确保

  1. rowModifyTime

的值是一个有效的时间戳,而不是一个字符串。可以使用

  1. TO_TIMESTAMP

函数将字符串转换为时间戳,如下所示:

  1. UPDATE b_car_table
  2. SET
  3. rowModifyTime=TO_TIMESTAMP(?,'YYYY-MM-DD HH24:MI:SS'),WHERE vehicleId=?;

在这个例子中,

  1. TO_TIMESTAMP

函数将字符串转换为时间戳,需要将

  1. ?

替换为时间字符串,格式为 ‘YYYY-MM-DD HH24:MI:SS’。

自动将驼峰转成了全部小写,数据库中的字段为deptId

org.postgresql.util.PSQLException: ERROR: column “deptid” of relation “b_station” does not exist

PostgreSQL 默认将标识符(如表名、列名)转换为小写。这就是为什么在数据库中定义的列名为 “deptId”,但在查询时自动转换为了小写的 “deptid”。

如果希望在查询时保留驼峰命名的大小写,可以使用双引号将列名括起来。例如,可以这样编写查询语句:

  1. SELECT"deptId"FROM b_station;

使用双引号将列名括起来后,PostgreSQL 将不会对该列名进行转换,而会按照指定的大小写进行匹配。

函数不存在

ifnull 函数不存在

org.postgresql.util.PSQLException: ERROR: function ifnull(character varying, unknown) does not exist

在 PostgreSQL 数据库中使用

  1. IFNULL

函数,但是 PostgreSQL 并不支持这个函数。

  1. IFNULL

是 MySQL 的函数,用于检查第一个表达式是否为

  1. NULL

,如果为

  1. NULL

,则返回第二个表达式的值。

在 PostgreSQL 中,可以使用

  1. COALESCE

函数来达到类似的效果。以下是一个例子:

  1. SELECTCOALESCE(column_name,'default_value')FROM table_name;

在这个例子中,

  1. COALESCE(column_name, 'default_value')

将检查

  1. column_name

是否为

  1. NULL

,如果为

  1. NULL

,则返回

  1. 'default_value'

  1. table_name

是表名,

  1. column_name

是想要检查的列。

如果在 Java 代码中使用

  1. IFNULL

函数,需要将其替换为

  1. COALESCE

函数,并确保 JDBC 查询字符串正确地使用了这个函数。

if函数不存在

改造 IF(bcard.status=‘2’,‘已激活’,‘未激活’)

在 PostgreSQL 中,可以使用 CASE 表达式对条件进行判断和转换。以下是将原 IF 表达式改写为 CASE 表达式的示例:

  1. CASEWHEN bcard.status='2'THEN'已激活'ELSE'未激活'END

在上面的代码中,我们使用 CASE 表达式来根据条件对 bcard.status 的值进行判断。如果 bcard.status 的值等于 ‘2’,则返回 ‘已激活’,否则返回 ‘未激活’。

group_concat函数不存在

Cause: org.postgresql.util.PSQLException: ERROR: function group_concat(character varying) does not exist

在 PostgreSQL 数据库中使用

  1. group_concat

函数,但是 PostgreSQL 并不支持这个函数。

  1. group_concat

是 MySQL 的函数,用于将多个行的数据连接成一个字符串。

在 PostgreSQL 中,可以使用

  1. string_agg

函数来达到类似的效果。以下是一个例子:

  1. SELECT string_agg(column_name,',')FROM table_name
  2. GROUPBY group_column;

在这个例子中,

  1. string_agg

函数将

  1. column_name

的所有行连接成一个以逗号分隔的字符串。

  1. table_name

是表名,

  1. group_column

是想要按照哪个列进行分组。

unix_timestamp函数不存在

org.postgresql.util.PSQLException: ERROR: function unix_timestamp(timestamp with time zone) does not exist

在 PostgreSQL 数据库中使用

  1. unix_timestamp

函数,但是 PostgreSQL 并不支持这个函数。

  1. unix_timestamp

是 MySQL 的函数,用于将日期或日期时间值转换为 Unix 时间戳。

在 PostgreSQL 中,可以使用

  1. EXTRACT

函数和

  1. EPOCH

来达到类似的效果。以下是一个例子:

  1. SELECT EXTRACT(EPOCH FROM timestamp_column)FROM table_name;

在这个例子中,

  1. EXTRACT(EPOCH FROM timestamp_column)

  1. timestamp_column

的值转换为 Unix 时间戳。

  1. table_name

是表名,

  1. timestamp_column

是时间戳列。

date_format函数不存在

Cause: org.postgresql.util.PSQLException: ERROR: function date_format(timestamp without time zone, unknown) does not exist

在 PostgreSQL 数据库中使用 date_format 函数,但是 PostgreSQL 并不支持这个函数。date_format 是 MySQL 的函数,用于格式化日期或日期时间值。

在 PostgreSQL 中,可以使用 TO_CHAR 函数来达到类似的效果。以下是一个例子:

  1. SELECT TO_CHAR(timestamp_column,'YYYY-MM-DD HH24:MI:SS')FROM table_name;

在这个例子中,TO_CHAR(timestamp_column, ‘YYYY-MM-DD HH24:MI:SS’) 将 timestamp_column 的值格式化为 ‘YYYY-MM-DD HH24:MI:SS’ 格式。table_name 是表名,timestamp_column 是时间戳列。

如果在 Java 代码中使用 date_format 函数,需要将其替换为 TO_CHAR 函数,并确保 JDBC 查询字符串正确地使用了这个函数。

find_in_set 函数不存在

你遇到的问题是在 PostgreSQL 数据库中使用

  1. FIND_IN_SET

函数,但是 PostgreSQL 并不支持这个函数。

  1. FIND_IN_SET

是 MySQL 的函数,用于在逗号分隔的列表中查找值。

在 PostgreSQL 中,你可以使用

  1. ANY

  1. = ANY

来达到类似的效果。以下是一个例子:

  1. SELECT*FROM table_name
  2. WHERE column_name =ANY(ARRAY[1,2,3]);

在这个例子中,

  1. column_name = ANY(ARRAY[1,2,3])

将查找

  1. column_name

是否在数组

  1. [1,2,3]

中。

  1. table_name

是你的表名,

  1. column_name

是你想要查找的列。

如果你在 Java 代码中使用

  1. FIND_IN_SET

函数,你需要将其替换为

  1. ANY

  1. = ANY

,并确保你的 JDBC 查询字符串正确地使用了这个函数。


本文转载自: https://blog.csdn.net/qq_32024669/article/details/134990372
版权归原作者 怪侠沈剑心 所有, 如有侵权,请联系我们删除。

“MySQL升级PostgreSQL遇到的常见问题及其解决方案”的评论:

还没有评论