我在将数据类型转换为TEXT列时遇到麻烦。
TEXT
我 HAVE 从一个自定义的CSV文件上传的所有数据。无法保证我什至会得到我期望的所有列,更不用说正确的数据类型了,因此我从一个表开始,其中所有列的类型均为TEXT并将空字符串放在空白处。
前任。桌子看起来像这样
创建表tbl1(col1 TEXT,col2 TEXT,col3 TEXT);
tbl1从文件加载后,我运行它。
tbl1
选择* FROM tbl1;
选择结果:
‘1’,’String1’,‘2.0’
‘2’,’String2’,‘3.14’
‘3’,’String3’,‘6.77776’
‘h’,’Stringh’,’hh’
’‘,’细绳’, ‘’
现在,我要从中获取数据tbl1并使用它来填充此表。
创建表tbl2(col1 INTEGER,col2 TEXT,col3 REAL);
我这样尝试。
从tbl1插入tbl2 SELECT CAST(tbl1.col1为INTEGER),tbl1.col2,CAST(tbl1.col3为实数);
之后,我运行这个
选择*从tbl2;
1,’String1’,2.0
2,’String2’,3.14
3,’String3’,6.77776
0,’Stringh’,0
0,’字符串’,0
我真正想要的是获取我认为是“良好”的强制转换并将其插入tbl2,然后取所有我认为是“不良”的强制转换并将其放入看起来像这样的“ tbl3”中。
tbl2
创建表tbl3(col1 TEXT,col2 TEXT,col3 TEXT,REASON_FOR_REJECTION TEXT);
tbl3 将用于报告,并可能会在拍摄不良数据时遇到麻烦。
tbl3
在将数据插入到C ++之前是否需要对其进行预处理,tbl2或者SQLite支持某种查询功能以允许我捕获“不良”类型转换吗?
通过在此末尾添加CL。的查询,我可以区分出哪些记录具有“错误的”强制类型转换,并清理tbl2并向中添加错误的数据行tbl3。
阅读有关类型相似性的SQLite文档。
当您将列声明为INTEGER或时REAL,SQLite将自动尝试转换值。任何无法转换的值将保留原始类型。
INTEGER
REAL
因此,只需将数据直接导入tbl2,然后使用类似的查询查找所有有错误的记录:
INSERT INTO tbl3 SELECT col1, col2, col3, trim(CASE typeof(col1) WHEN 'integer' THEN '' ELSE 'col1:' || typeof(col1) END || ' ' || CASE typeof(col3) WHEN 'real' THEN '' ELSE 'col3:' || typeof(col3) END) FROM tbl2 WHERE typeof(col1) != 'integer' OR typeof(col3) != 'real'