0

我在TEXT列中转换数据类型时遇到问题。

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

前任。表看起来像这样

创建表 tbl1(col1 文本,col2 文本,col3 文本);

从文件加载后tbl1,我运行它。

选择 * 从 tbl1;

选择结果:

'1','String1','2.0'

'2','String2','3.14'

'3','String3', '6.77776'

'h','Stringh','hh'

'','细绳', ''

现在我想从中获取数据tbl1并使用它来填充此表。

创建表 tbl2(col1 整数,col2 文本,col3 实数);

我尝试这样。

INSERT INTO tbl2 SELECT CAST(tbl1.col1 as INTEGER), tbl1.col2, CAST(tbl1.col3 AS REAL) FROM tbl1;

之后我运行这个,

选择 * 从 tbl2;

选择结果:

1,'String1', 2.0

2,'String2', 3.14

3,'String3', 6.77776

0,'字符串', 0

0,'字符串', 0

我真正想要的是抓住我认为“好”的演员表并将它们插入tbl2然后取出我认为“坏”演员表的所有值并将它们放入看起来像这样的“tbl3”中。

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

tbl3将用于报告和可能解决不良数据的问题。

在将这些数据插入之前,我是否需要在 C++ 中对其进行预处理,tbl2或者 SQLite 是否支持某种允许我捕捉“坏”强制转换的查询功能?

更新:

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

4

1 回答 1

1

阅读有关 type affinity的 SQLite文档。

当您将列声明为INTEGERorREAL时,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'
于 2013-03-05T08:47:21.507 回答