小编典典

在C ++中将SQLite TEXT CAST转换为INTEGER或REAL会执行太多操作

sql

我在将数据类型转换为TEXT列时遇到麻烦。

HAVE
从一个自定义的CSV文件上传的所有数据。无法保证我什至会得到我期望的所有列,更不用说正确的数据类型了,因此我从一个表开始,其中所有列的类型均为TEXT并将空字符串放在空白处。

前任。桌子看起来像这样

创建表tbl1(col1 TEXT,col2 TEXT,col3 TEXT);

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”中。

创建表tbl3(col1 TEXT,col2 TEXT,col3 TEXT,REASON_FOR_REJECTION TEXT);

tbl3 将用于报告,并可能会在拍摄不良数据时遇到麻烦。

在将数据插入到C ++之前是否需要对其进行预处理,tbl2或者SQLite支持某种查询功能以允许我捕获“不良”类型转换吗?

更新:

通过在此末尾添加CL。的查询,我可以区分出哪些记录具有“错误的”强制类型转换,并清理tbl2并向中添加错误的数据行tbl3


阅读 231

收藏
2021-05-16

共1个答案

小编典典

阅读有关类型相似性的SQLite文档

当您将列声明为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'
2021-05-16