【发布时间】:2021-02-05 16:59:22
【问题描述】:
如何在 Oracle PL/SQL 查询的 SELECT 子句中指定精度有限的文字数字? CAST 是唯一的方法吗?
我想这样做,但列的类型最终为 NUMBER,而我希望类型匹配 l.changed_rows_log_id,即 NUMBER(18,0)。
SELECT COALESCE(l.changed_rows_log_id, 1) AS Col1 FROM mytable l;
如果我把它留在那里,消费进程可能会在类型 NUMBER 上犹豫不决,因为它可能包含非常大的数字——所有这些都是因为文字 1。
相反,我不得不尴尬地这样做。有没有更好的办法?
SELECT CAST(COALESCE(l.changed_rows_log_id, 1) AS NUMBER(18,0)) AS Col1 FROM mytable l;
【问题讨论】:
-
这只会让你觉得尴尬,直到你习惯它。事实上,这是做你想做的事情的常见方式。
-
问题不在于您的表存储的数字大于表达式的
data type中int(-2147483648 to 2147483647) 的限制吗?NUMBER(18,0)也可以存储超出限制的整数。 -
不完全是,但我看到我写问题时的错误造成的混乱。我已经编辑了我的问题,因为它确实是 Java 中的 64 位整数 (
long)。 -
..
changed_rows_log_id中导致溢出的值是什么?我的意思是,客户端的混乱 不是在制造getInt而不是getLong?我仍然不明白如何通过转换数据类型来保护客户端。 -
知道了!元数据检查失败,所以你必须
cast向下数据类型,这正是你正在做的;)