2017-08-30 4 views
1

私のテーブルには6桁のコードがあります。データが既定の長さでsqlに数字があることを確認します

myCode CHAR(6) PRIMARY KEY CHECK (SUBSTRING (myCode ,1 ,1) >='0' AND 
SUBSTRING (myCode ,1 ,1) <= '9' AND ...#for all positions 

これより高速な方法がありますか?正規表現の使用

+1

万レコードのあなたの計画は何ですか? –

+0

@DanBracuk彼らは市町村、地方および地域のコードなので、計画はありません。彼らは200000そうではありません:)、私はちょうど最適化がほしいです –

答えて

2

シンプル:

\d is the class shorthand for digits
\と別の\をエスケープする場合は、古いバージョンのstandard_conforming_strings = offを使用している場合を除きます。参照:必要な

ませ括弧を。
char(6)を使用している間は、開始と終了の式を固定するために^$も必要ありません(傷ついていなくても)。データタイプが完全なナンセンスではないまれなユースケースです。参照:

短い文字列は空白埋めているとCHECK制約を渡すことはありません。
長い文字列は、タイプchar(6)の長さ指定に合格しません。
(しかし、注意してください!'1234567'::char(6)よう明示的キャストが静かに切り捨てられます。)

CREATE TABLE tbl (mycode char(6) PRIMARY KEY CHECK (mycode ~ '\d{6}')); 

は、私はまだ時代遅れタイプchar(6)を使用しないように助言します。コーナーケースでの奇妙な動作。代わりにtextを使用してください。そして、あなたが実際に正規表現式に^$が必要です

CREATE TABLE tbl (mycode text PRIMARY KEY CHECK (mycode ~ '^\d{6}$')); 

dbfiddle here


あなたが(本当に新しい質問)コメント:その桁程度

と何を内部は異なっている必要がありますか?

文字列の一意の数字を強制するのは簡単ではありません。あなたはがインストールされている場合は、sort()uniq()とエレガントな解決策があります:

CREATE TEMP TABLE tbl3 (
    mycode varchar(6) PRIMARY KEY 
, CONSTRAINT chk_6_distinct_digits 
     CHECK (cardinality(uniq(sort(string_to_array(mycode, NULL)::int[]))) = 6) 
); 
4

CREATE TABLE tabq(myCode CHAR(6) PRIMARY KEY CHECK (myCode ~'^([0-9]{6})$')); 

をあなただけない一致このパターンを行うレコードを識別したい場合は、試みることができる:

SELECT * 
FROM tabq 
WHERE myCode !~ '^\\d{6}$'; 

Rextester Demo

+0

@TimBiegeleisen拡張ありがとう:) – lad2025

+0

ナア、最近あなたは火の上にいて、upvotesに値する:P –

+0

@ lad2025とその数字は何である必要があります独特の??? –

関連する問題