在我的表中,我有一列是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
是否還有另一種方法比這更快?
簡單:
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)
);
使用正則表達式:
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所以:),我只想優化 –