【问题标题】:Liquibase <sql> command giving different result than running it directly in SQLLiquibase <sql> 命令给出的结果与直接在 SQL 中运行不同
【发布时间】:2019-12-30 04:00:07
【问题描述】:

我有下表:

id: BIGINT
value: DOUBLE
test: VARCHAR

与价值观:

id: 1
value: 0.99
test: ''

在我的 postgresql shell 中运行以下 SQL 注释,我得到的结果与在 Liquibase &lt;sql&gt; 标记中运行它不同:

UPDATE myTable SET test=concat('value=', value);

如果我直接在我的 SQL shell 中运行它,我的测试值为 value=0.99 但是如果我在 Liquibase &lt;sql&gt; 标记中运行相同的 SQL 命令,我会得到 value=0.98999999999999999

显然这是一个浮点错误,但如果我使用&lt;sql&gt;,为什么 Liquibase 会给出不同的结果?结果不应该相同吗?

【问题讨论】:

  • 之间的 Liquibase 的 SQL 命令到底是什么;还有在你的 shell 中运行的 SQL 命令到底是什么?您可以在不使用任何变量(例如value)的情况下同时进行这两项操作并进行比较吗?
  • 我在两者中运行完全相同的命令:UPDATE myTable SET test=concat('value=', value)

标签: java sql postgresql liquibase


【解决方案1】:

如果您正在执行完全相同的 SQL 字符串,我会期望得到相同的结果。但是,您将 value 作为变量提供,其类型由 Liquibase 处理,因此与包含数据库执行的数字文字的原始查询字符串相比,可能是 Liquibase 数字解析不同。

如果你要使用类似的东西:value: '0.99'... SET test=concat('value=', CAST(value AS double precision)) 可能会得到相同的结果。

【讨论】:

  • 不幸的是,这也不起作用。看起来 Liquibase 中的某些东西正在解析这些值。这对我来说很奇怪,因为 标签应该允许直接 sql 操作而不受 Liquibase 的影响...
  • 但这不是直接的,因为您没有将文字 0.99 放入 &lt;sql&gt; 字符串 &lt;/sql&gt; 您正在使用通过 Liquibase 变量间接提供的值。奇怪的是 CAST 并没有使它变得相同。
  • 我的理解是标签中的任何东西都和直接在数据库shell中运行一样。它只是通过命令。不幸的是,这并没有发生,它似乎正在尝试做某事。
  • 我误读了这个问题。这个UPDATE myTable SET test=concat('value=', value); 在你的shell 中使用。如果在 shell 中运行与 Liquibase 完全相同的 SQL 字符串会发生什么?也许是 shell 中的双重解析不同。
  • 感谢您的帮助,非常感谢。不幸的是,我也没有答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 2022-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多