次のSQLiteの例では、特定の列に数値以外の値を持つ行のみが返されます。
サンプルデータ
サンプルデータを使用してテーブルを作成しましょう:
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
c1
);
INSERT INTO t1 (c1) VALUES
(0),
(1),
(+1),
(-1),
(00.00),
(73.45),
(+73.45),
(-73.45),
(.246),
(-.34e7),
(12.e-3),
(1.2e+4),
('Ten'),
('5 Dollars');
SELECT * FROM t1;
これでテーブルが作成され、次のデータが含まれています。
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
SQLiteは動的型システムを使用します。このシステムでは、値のデータ型が列ではなく値自体に関連付けられます(他のほとんどのRDBMSと同様)。テーブルを作成したとき、データ型を指定しませんでした。したがって、値は任意のタイプにすることができます。
Typeof()
機能
SQLiteのtypeof()関数を使用して、数値型(real
)を除外できます。 およびinteger
)クエリで返されることから:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'real'
AND typeof(c1) <> 'integer';
結果:
c1 --------- Ten 5 Dollars
各行のデータ型を出力する別の例を次に示します。
SELECT
c1,
typeof(c1)
FROM t1;
結果:
c1 typeof(c1) ---------- ---------- 0 integer 1 integer 1 integer -1 integer 0.0 real 73.45 real 73.45 real -73.45 real 0.246 real -3400000.0 real 0.012 real 12000.0 real Ten text 5 Dollars text
これは、最後の2行のみに数値以外のデータが含まれていることを示しています(text
が含まれています)。 データ)。
REGEXP
機能
もう1つのオプションは、REGEXP
を使用することです。 正規表現を渡して、指定されたパターンに一致する値だけを返すようにします。
例:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
結果:
c1 --------- Ten 5 Dollars
非整数を返す
非整数のみを返したい場合は、次のようにすることができます。
SELECT c1
FROM t1
WHERE typeof(c1) <> 'integer';
結果:
c1 ---------- 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
これは符号付き整数も除外します。
または、要件がより具体的である場合は、正規表現を使用できます。
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[0-9]+$';
結果:
c1 ---------- -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
数値データは含まれていません
数値データを含まない行を検索する場合は、次のように実行できます。
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[0-9]+';
結果:
c1 --- Ten