在C ++中SQLite TEXT CAST到INTEGER或REAL太多了

时间:2013-03-05 01:14:18

标签: c++ sql sqlite

我在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'强制转换?

UPDATE:

通过在此结尾添加CL。的查询,我可以区分哪些记录有“错误”转换并清理tbl2并将错误数据行添加到tbl3

1 个答案:

答案 0 :(得分:1)

阅读SQLite documentation about type affinity

当您将列声明为INTEGERREAL时,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'