我在TEXT
列中投放数据类型时遇到问题。
我已从自定义CSV文件上传所有数据。我无法保证我甚至可以得到我期望的所有列,更不用说正确的数据类型了,所以我从一个表开始,其中所有列都是TEXT类型,并将空字符串放在空白处。
实施例。 表看起来像这样
CREATE TABLE tbl1(col1 TEXT,col2 TEXT,col3 TEXT);
从文件加载tbl1
后,我运行它。
SELECT * FROM tbl1;
选择结果:
'1','String1','2.0'
'2','String2','3.14'
'3','String3','6.77776'
'h','Stringh','h.h'
'','字符串',''
现在我想从tbl1
获取数据并使用它来填充此表。
CREATE TABLE tbl2(col1 INTEGER,col2 TEXT,col3 REAL);
我试试这样。
INSERT INTO tbl2 SELECT CAST(tbl1.col1 as INTEGER),tbl1.col2,CAST(tbl1.col3 AS REAL)FROM tbl1;
之后我运行了这个,
SELECT * FROM tbl2;
选择结果:
1,'String1',2.0
2,'String2',3.14
3,'String3',6.77776
0,'Stringh',0
0,'String',0
我真正想要的是抓住我认为'好'的角色并将它们插入tbl2
然后取出我认为'坏'的所有值,并将它们放入'tbl3'中看起来像这样。
CREATE TABLE tbl3(col1 TEXT,col2 TEXT,col3 TEXT,REASON_FOR_REJECTION TEXT);
tbl3
将用于报告并可能无法解决错误数据。
在将数据插入tbl2
之前,我是否需要在C ++中预处理这些数据?或者SQLite是否支持某种查询功能,以便我能够捕获'Bad'强制转换?
通过在此结尾添加CL。的查询,我可以区分哪些记录有“错误”转换并清理tbl2
并将错误数据行添加到tbl3
。
答案 0 :(得分:1)
阅读SQLite documentation about type affinity。
当您将列声明为INTEGER
或REAL
时,SQLite会自动尝试转换值。
任何无法转换的值都将保留原始类型。
所以只需将您的数据直接导入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'