私のテーブルには6桁のコードがあります。データが既定の長さでsqlに数字があることを確認します
myCode CHAR(6) PRIMARY KEY CHECK (SUBSTRING (myCode ,1 ,1) >='0' AND
SUBSTRING (myCode ,1 ,1) <= '9' AND ...#for all positions
これより高速な方法がありますか?正規表現の使用
私のテーブルには6桁のコードがあります。データが既定の長さでsqlに数字があることを確認します
myCode CHAR(6) PRIMARY KEY CHECK (SUBSTRING (myCode ,1 ,1) >='0' AND
SUBSTRING (myCode ,1 ,1) <= '9' AND ...#for all positions
これより高速な方法がありますか?正規表現の使用
シンプル:
\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)
);
:
CREATE TABLE tabq(myCode CHAR(6) PRIMARY KEY CHECK (myCode ~'^([0-9]{6})$'));
をあなただけない一致このパターンを行うレコードを識別したい場合は、試みることができる:
SELECT *
FROM tabq
WHERE myCode !~ '^\\d{6}$';
@TimBiegeleisen拡張ありがとう:) – lad2025
ナア、最近あなたは火の上にいて、upvotesに値する:P –
@ lad2025とその数字は何である必要があります独特の??? –
万レコードのあなたの計画は何ですか? –
@DanBracuk彼らは市町村、地方および地域のコードなので、計画はありません。彼らは200000そうではありません:)、私はちょうど最適化がほしいです –