‘=’特殊运算符和‘-’关联报错

目录

环境

症状

问题原因

解决方案

环境

系统平台: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-*’格式即可避免词法分析器的检查。

更多解决方案请登录【瀚高技术支持平台】 查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值