鉴于此表,
CREATE TABLE test (
c01 INT,
c02 NUMBER(10,5),
c03 NUMBER(18,10)
);
我使用 OCCI(C++ 库)来执行以下 SELECT 查询:
select case(c01) when 10 then c02 else c03 end from test;
在本例中,我得到的类型代码是 OCCI_SQLT_NUM
,但精度和小数位数均为 0
。 (0
精度和小数位数)是什么意思?这是一个错误吗?
在不知道精度/小数位数的情况下,程序的类型安全、语义和正确性都处于危险之中,因为无法决定是将其视为整数还是>浮点。
换句话来说,CASE(x) WHEN y THEN a ELSE b
表达式的类型是什么? a
可以是 INT
且 b
可以是 CHAR[32]
吗?我想不是。那么类型是如何计算的呢?
最佳答案
在 CASE
表达式中,THEN
和 ELSE
子句中表达式的数据类型必须兼容。因此,不能在 NUMBER
子句中包含 THEN
,然后在 DATE
子句中包含 VARCHAR2
或 ELSE
。
但是,精度和小数位数不是数据类型的一部分。最好将精度和小数位数视为表中允许的值的约束。 NUMBER(10,2)
与 NUMBER
的数据类型相同,但有限制,即总位数不得超过十位,包括为小数部分保留的两位,并且小数点后不得超过两位。 (然后,插入 5.333
仍然有效 - 但只是因为 Oracle 会自动且无警告地舍入此数字以适合该列...但是如果您给它输入 123456123456
,则没有“舍入”使其适合,因此插入将会失败)。 CASE
表达式的数据类型就是 NUMBER
。 (顺便说一句,在 Oracle SQL 中,甚至 INT
也是一个约束 - Oracle 不进行整数算术!!)
NUMBER(0,0)
在 Oracle 中不存在;如果您尝试 CREATE TABLE test (col NUMBER(0,0))
,它将失败。错误消息会告诉您精度(第一个数字)必须在 1 到 38 之间。因此,无论生成什么 NUMBER(0,0)
听起来都像是一个错误。
关于c++ - 当 select 子句中使用 case 时,Oracle 数字精度和小数位数均为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41277695/