次のPostgreSQLの例では、特定の列に数値がある行のみが返されます。
サンプルデータ
サンプルデータを使用してテーブルを作成しましょう:
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
c1 varchar(255)
);
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'),
('a'),
('9afc'),
('e7'),
('+e0'),
('Ten'),
('5 Dollars');
SELECT * FROM t1;
これでテーブルが作成され、次のデータが含まれています。
c1 ----------- 0 1 +1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 12.e-3 1.2e+4 a 9afc e7 +e0 Ten 5 Dollars
列はvarchar(255)
です 列なので、数値ではありません。数字を含めることができます(実際に含めることができます)が、これらは文字データとして保存されます。任意のテキストを含めることもできます(これは含まれます)。
すべての数値を返す
次のクエリを使用して、上記の表からすべての数値を返すことができます。
SELECT c1
FROM t1
WHERE c1 ~ '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
結果:
c1 -------- 0 1 +1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 1.2e+4
整数を返す
整数のみを返したい場合は、クエリをはるかに簡単にすることができます。
SELECT c1
FROM t1
WHERE c1 ~ '^[0-9]+$';
結果:
c1 ---- 0 1
数値データが含まれています
数値データを含む行を検索する場合(数値以外のデータも含まれている場合でも)、次のように実行できます。
SELECT c1
FROM t1
WHERE c1 ~ '[0-9]+';
結果:
c1 ----------- 0 1 +1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 12.e-3 1.2e+4 9afc e7 +e0 5 Dollars>
PostgreSQLでは、~
指定された正規表現を照合するための大文字と小文字を区別する演算子です。大文字と小文字を区別しない一致の場合は、~*
を使用します 。
!~
を使用できます 正規表現(および!~*
)と一致しないすべての行を返す 大文字と小文字を区別しない一致の場合)。
POSIX文字クラス
PostgresはPOSIX文字クラスもサポートしています。したがって、[:digit:]
を使用できます [0-9]
の代わりに 必要に応じて。
例:
SELECT c1
FROM t1
WHERE c1 ~ '^[[:digit:]]?$';
結果:
c1 ---- 0 1