c++ - SQLite TEXT CAST to INTEGER or REAL in C++ Does too much

标签 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,'字符串 1', 2.0

2,'String2', 3.14

3,'String3', 6.77776

0,'字符串', 0

0,'字符串', 0

我真正想要的是获取我认为是“好”的转换并将它们插入 tbl2 然后获取我认为是“坏”转换的所有值并将它们放入“tbl3” ' 看起来像这样。

CREATE TABLE tbl3 (col1 TEXT, col2 TEXT, col3 TEXT, REASON_FOR_REJECTION TEXT);

tbl3 将用于报告和可能的故障排除错误数据。

在将数据插入 tbl2 之前,我是否需要在 C++ 中对其进行预处理,或者 SQLite 是否支持某种允许我捕获“错误”转换的查询函数?

更新:

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

最佳答案

阅读 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'

关于c++ - SQLite TEXT CAST to INTEGER or REAL in C++ Does too much,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15214102/

相关文章:

SQL:计算可以有空值的列

SQL Server简单锁定示例

ios - 从两个应用程序访问共享数据

delphi - 如何使用Delphi处理内存有限的超大型列表

c++ - 类型转换运算符重载问题

C++ 将带\0 的字符串拆分为列表

c++ - 如何纠正 GDI 资源泄漏?

c++ - if( var == 'x' ) 这样的语句中的文字存储在哪里?

mysql - 外键在同一张表中,无法得到正确的查询

sqlite - 我可以在创建后将 sqlite 表中的列更改为 AUTOINCREMENT 吗?