如何使用嵌套查询更新行
How to update rows using nested queries
我有一个 table,其中出生日期为 0000-00-00,格式为 YYYY-MM-DD。我已将这些日期更新为实际 DOB 的任务。
DOB 只能从看起来像 950313094353
(不是真正的 IC 号码)的身份证号码中提取,并且 IC 的创建方式类似于 YYMMDDSNRAND
,其中 SN
是州号码,例如09 和 RAND
只是 4 个随机数,例如 4353.
从身份证号码,我可以通过减去前 6 位数字得到出生日期。
table
student_st
IC_NO D_BIRTH COUNTRY
------------ ---------- --------
940525053455 0000-00-00 MALAYSIA
IC_NO的数据类型是varchar,D_BIRTH是date,COUNTRY是varchar
我试过的代码是
UPDATE `student_st`
SET `D_BIRTH` = CONCAT('19', (SELECT SUBSTR(`IC_NO`, 1, 2) FROM `student_st` WHERE `COUNTRY`='MALAYSIA'),
'-', (SELECT SUBSTR(`IC_NO`, 3, 2) FROM `student_st` WHERE `COUNTRY`='MALAYSIA'),
'-', (SELECT SUBSTR(`IC_NO`, 5, 2) FROM `student_st` WHERE `COUNTRY`='MALAYSIA'))
WHERE `COUNTRY`='MALAYSIA' AND DATE(`D_BIRTH`)='0000-00-00'
这是我遇到的错误
Error in query (1292): Truncated incorrect date value: '0000-00-00'
我不知道为什么会出现这样的错误。
根据我的代码,我预期的结果是 19YY-MM-DD
其中 YY、MM 和 DD 从 IC 号码的子字符串中获得。
您不需要在子查询中进行所有这些选择更新是逐行更新。
drop table if exists t;
create table t
(IC_NO varchar(20), D_BIRTH date, country varchar(20));
insert into t values
(940525053455 , '0000-00-00','malasia'),
(960525053455 , '1995-05-25','malasia'),
(940525053455 , '0000-00-00','aa');
update t
set d_birth = str_to_date(concat('19',SUBSTR(`IC_NO`, 1, 2),SUBSTR(`IC_NO`, 3, 2) ,SUBSTR(`IC_NO`, 5, 2)),'%Y%m%d')
where country = 'malasia' and d_birth = '0000-00-00'
;
select * from t;
+--------------+------------+---------+
| IC_NO | D_BIRTH | country |
+--------------+------------+---------+
| 940525053455 | 1994-05-25 | malasia |
| 960525053455 | 1995-05-25 | malasia |
| 940525053455 | 0000-00-00 | aa |
+--------------+------------+---------+
3 rows in set (0.00 sec)
我有一个 table,其中出生日期为 0000-00-00,格式为 YYYY-MM-DD。我已将这些日期更新为实际 DOB 的任务。
DOB 只能从看起来像 950313094353
(不是真正的 IC 号码)的身份证号码中提取,并且 IC 的创建方式类似于 YYMMDDSNRAND
,其中 SN
是州号码,例如09 和 RAND
只是 4 个随机数,例如 4353.
从身份证号码,我可以通过减去前 6 位数字得到出生日期。
table
student_st
IC_NO D_BIRTH COUNTRY
------------ ---------- --------
940525053455 0000-00-00 MALAYSIA
IC_NO的数据类型是varchar,D_BIRTH是date,COUNTRY是varchar
我试过的代码是
UPDATE `student_st`
SET `D_BIRTH` = CONCAT('19', (SELECT SUBSTR(`IC_NO`, 1, 2) FROM `student_st` WHERE `COUNTRY`='MALAYSIA'),
'-', (SELECT SUBSTR(`IC_NO`, 3, 2) FROM `student_st` WHERE `COUNTRY`='MALAYSIA'),
'-', (SELECT SUBSTR(`IC_NO`, 5, 2) FROM `student_st` WHERE `COUNTRY`='MALAYSIA'))
WHERE `COUNTRY`='MALAYSIA' AND DATE(`D_BIRTH`)='0000-00-00'
这是我遇到的错误
Error in query (1292): Truncated incorrect date value: '0000-00-00'
我不知道为什么会出现这样的错误。
根据我的代码,我预期的结果是 19YY-MM-DD
其中 YY、MM 和 DD 从 IC 号码的子字符串中获得。
您不需要在子查询中进行所有这些选择更新是逐行更新。
drop table if exists t;
create table t
(IC_NO varchar(20), D_BIRTH date, country varchar(20));
insert into t values
(940525053455 , '0000-00-00','malasia'),
(960525053455 , '1995-05-25','malasia'),
(940525053455 , '0000-00-00','aa');
update t
set d_birth = str_to_date(concat('19',SUBSTR(`IC_NO`, 1, 2),SUBSTR(`IC_NO`, 3, 2) ,SUBSTR(`IC_NO`, 5, 2)),'%Y%m%d')
where country = 'malasia' and d_birth = '0000-00-00'
;
select * from t;
+--------------+------------+---------+
| IC_NO | D_BIRTH | country |
+--------------+------------+---------+
| 940525053455 | 1994-05-25 | malasia |
| 960525053455 | 1995-05-25 | malasia |
| 940525053455 | 0000-00-00 | aa |
+--------------+------------+---------+
3 rows in set (0.00 sec)