错误:运算符不存在:numeric〜* unknown

时间:2013-12-30 23:04:33

标签: sql postgresql

我需要在PostgreSQL中创建domain的价格。价格必须是NUMERIC(9,2),其中9是精度,2是比例。在尝试创建域获取时:

ERROR: operator does not exist: numeric ~* unknown Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.

QUERY:

CREATE DOMAIN d_price AS NUMERIC(9, 2) NOT NULL 
CONSTRAINT Product_price_can_contain_only_double_precision_value
CHECK(VALUE ~*'^(([[:digit:]])+\.([[:digit:]]){2})$');

2 个答案:

答案 0 :(得分:4)

在使用字符串运算符之前,您需要将数值作为字符串,将VALUE更改为:CAST(VALUE AS TEXT)

答案 1 :(得分:4)

您的CHECK约束是荒谬的,因为它在之后应用了,该值已被数据库引擎的数字解析器转换为NUMERIC

VALUE ~*'^(([[:digit:]])+\.([[:digit:]]){2})$')

似乎说“一个或多个前导数字,一个句号,正好两个尾随数字”。一旦解析了数字,就无法以任何有用的方式进行检查。观察:

regress=> SELECT NUMERIC(18,2) '1', NUMERIC(18,2) '1.12345';
 numeric | numeric 
---------+---------
    1.00 |    1.12
(1 row)

无论输入是什么,如果它适合您指定的NUMERIC,它将被扩展为适合。如果它不符合您提供的NUMERIC大小,则会在CHECK约束运行之前产生错误。