隐式转换基本规则
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)
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25052
- 42023-09-25浏览数:18521
- 52020-05-11浏览数:17526