目录
环境
系统平台:N/A
版本:4.7.7,4.3.4
症状
highgo=# SELECT * FROM TEST WHERE id !=-1; ERROR: 42883: operator does not exist: integer !=- integer LINE 1: SELECT * FROM TEST WHERE id !=-1; ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. |
在SQL语句中‘=’和‘-’之间有特殊运算符会报错“操作符不存在”。
问题原因
HGDB中并没有=-这个操作符,刚才的2 =- 3会被解析成2 = (-3)。HGDB的词法分析器,会把=-拆分成=和-两个操作符,但如果=-前面还有~!@#^&|`?%中的任一字符,则不拆分,当做一个整体。所以会报告找不到 !=- 这个操作符。
此外可以通过如下几个步骤验证一下:
highgo=# CREATE table TEST ( id serial primary key, dou_num numeric ); 日志: 00000: 语句: CREATE table TEST ( id serial primary key, dou_num numeric ); CREATE TABLE highgo=# INSERT INTO TEST(DOU_NUM) VALUES(1),(-1); INSERT 0 2 highgo=# select * from test; id | dou_num ----+--------- 1 | 1 2 | -1 (2 rows) highgo=# highgo=# SELECT * FROM TEST WHERE DOU_NUM !=1; id | dou_num ----+--------- 2 | -1 (1 row) highgo=# SELECT * FROM TEST WHERE DOU_NUM !=-1; 错误: 42883: 操作符不存在: numeric !=- integer 第 34 个字符处 提示: 没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换. 语句: SELECT * FROM TEST WHERE DOU_NUM !=-1; 错误: 42883: 操作符不存在: numeric !=- integer LINE 1: SELECT * FROM TEST WHERE DOU_NUM !=-1; ^ HINT: 没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换. highgo=# SELECT * FROM TEST WHERE DOU_NUM !=1; id | dou_num ----+--------- 2 | -1 (1 row) highgo=# SELECT * FROM TEST WHERE DOU_NUM !=-1; 错误: 42883: 操作符不存在: numeric !=- integer 第 34 个字符处 提示: 没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换. 语句: SELECT * FROM TEST WHERE DOU_NUM !=-1; 错误: 42883: 操作符不存在: numeric !=- integer LINE 1: SELECT * FROM TEST WHERE DOU_NUM !=-1; ^ HINT: 没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换. highgo=# SELECT * FROM TEST WHERE DOU_NUM !='-1'; id | dou_num ----+--------- 1 | 1 (1 row) highgo=# SELECT * FROM TEST WHERE DOU_NUM =-1; id | dou_num ----+--------- 2 | -1 (1 row) highgo=# SELECT * FROM TEST WHERE DOU_NUM !=0-1; id | dou_num ----+--------- 1 | 1 (1 row) |
解决方案
在‘=’和‘-’之间有特殊运算符的时候‘-’前面添加空格或者写成‘0-*’格式即可避免词法分析器的检查。
更多解决方案请登录【瀚高技术支持平台】 查看