0

列のデータ型のキャストに問題がありTEXTます。

カスタムCSVファイルからすべてのデータをアップロードする必要があります。適切なデータ型は言うまでもなく、期待するすべての列を取得できるという保証はないため、すべての列が TEXT 型であるテーブルから始めて、空白の場所に空の文字列を配置します。

元。表はこんな感じ

CREATE TABLE tbl1 (col1 テキスト、col2 テキスト、col3 テキスト);

tbl1ファイルからロードした後、これを実行します。

SELECT * FROM tbl1;

結果を選択:

'1'、'文字列 1'、'2.0'

'2'、'文字列 2'、'3.14'

'3'、'文字列 3'、'6.77776'

'h','Stringh', 'hh'

''、'弦'、 ''

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,'文字列2', 3.14

3,'文字列3', 6.77776

0,'ストリングス', 0

0,'文字列', 0

私が本当に望んでいるのは、「良い」キャストと見なされるものを取得して挿入しtbl2、「悪い」キャストと見なされるすべての値を取得して、次のような「tbl3」に配置することです。

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

tbl3レポートと、場合によっては不良データのトラブルシューティング用です。

このデータを挿入する前に C++ で前処理する必要がありますtbl2か、それとも SQLite は「不正な」キャストをキャッチできる何らかのクエリ関数をサポートしていますか?

アップデート:

この末尾に CL. のクエリを追加することで、どのレコードに「不適切な」キャストが含まれているかを識別し、クリーンアップしtbl2て不適切なデータ行を に追加することができましたtbl3

4

1 に答える 1

1

タイプ アフィニティに関するSQLite ドキュメントを参照してください。

列をINTEGERorとして宣言する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'
于 2013-03-05T08:47:21.507 に答える