2017-08-30 37 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

簡單:

mycode ~ '\d{6}' 

\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和那裏面的數字必須是什麼不同??? –