GBase 8a
其他
文章

隐式转换基本规则

发表于2024-03-18 10:36:0774次浏览1个评论

sql计算过程中,存在类型不一致时会进行隐式转换,隐式转换可能导致结果不固定,所以要避免隐式转换的发生。

隐式转换基本规则如下:
(1)列和列比较时,右侧类型向左侧转;
(2)列和常量比较时,常量向列转;
(3)常量和常量比较时,字符向数值类型转


gbase> create table t1(c1 int,c2 varchar(10));
Query OK, 0 rows affected (Elapsed: 00:00:00.17)

gbase> create table t2(c1 int,c2 varchar(10));
Query OK, 0 rows affected (Elapsed: 00:00:00.09)

gbase> insert into t1 values(1,'01');
Query OK, 1 row affected (Elapsed: 00:00:00.15)

gbase> insert into t2 values(1,'01');
Query OK, 1 row affected (Elapsed: 00:00:00.07)

(1)字符串01转化成数值后可以和1匹配,数值1转化成字符串后无法和01匹配,join等值条件调换顺序后结果集不同。
gbase> select * from t1 join t2 on t1.c1=t2.c2;
+------+------+------+------+
| c1   | c2   | c1   | c2   |
+------+------+------+------+
|    1 | 01   |    1 | 01   |
+------+------+------+------+
1 row in set (Elapsed: 00:00:00.27)

gbase> select * from t1 join t2 on t2.c2=t1.c1;
Empty set (Elapsed: 00:00:00.13)

(2)列和常量比较,常量向列类型转换。
gbase> select * from t1 where c1='01';
+------+------+
| c1   | c2   |
+------+------+
|    1 | 01   |
+------+------+
1 row in set (Elapsed: 00:00:00.04)

gbase> select * from t1 where c2=1;
Empty set (Elapsed: 00:00:00.03)


(3)两个常量,字符串向数值转换,和左右位置无关。
gbase> select * from t1 where 1='01';
+------+------+
| c1   | c2   |
+------+------+
|    1 | 01   |
+------+------+
1 row in set (Elapsed: 00:00:00.03)

gbase> select * from t1 where '01'=1;
+------+------+
| c1   | c2   |
+------+------+
|    1 | 01   |
+------+------+
1 row in set (Elapsed: 00:00:00.03)
 

评论

登录后才可以发表评论
崔哥发表于 9个月前
给你点个赞