2011-08-26 71 views
2

我需要存儲Medicare APC codes.我相信格式需要4個號碼數字數據類型。前導零是相關的。有沒有任何方法來存儲這種數據類型與驗證?我應該如何存儲這些數據(varchar(4),int)?SQL - 帶前導零

回答

2
varchar(4) 

可選地,您仍然可以添加檢查約束來確保數據具有前導零的數字。這個例子會在Oracle中引發異常。在其他RDBMS,你可以使用正則表達式檢查:

alter table X add constraint C 
check (cast(APC_CODE as int) = cast(APC_CODE as int)) 
+0

你的檢查約束怎麼會返回FALSE? – Sparky

+0

@Sparky,好點。它不會返回錯誤。它引發了一個例外。至少在Oracle –

+0

謝謝,這是有道理的。編程在捕獲異常和檢測數據庫約束錯誤之間會有點不同。我傾向於尋找約束錯誤,但是你的建議也是一個簡潔的方法.. – Sparky

2

這不是數字數據;它是恰好包含數字的文本數據。

使用VARCHAR

+0

+1好技巧中,我將使用這些信息。 –

0

如果您需要前導零,那麼你必須使用一個varchar或其他字符串數據類型。

有一些方法可以格式化爲前導零輸出,而不影響您的實際數據。

See this blog entry for an easy method.

0

CHAR(4)似乎更適合我(如果我理解你的權利,並且代碼始終是4個位數)。

0

你想使用的是具有CHECK約束VARCHAR數據類型,使用LIKE用一個模式來檢查數值。

1

如果您確信,APC代碼將永遠是數字(即如果它不會在不久的將來改變),更好的辦法是使數據庫列的值,並處理格式(以包括前導零)在您使用此字段值的地方。

3

我同意,使用

CHAR(4) 

檢查約束使用

check(APC_ODE LIKE '[0-9][0-9][0-9][0-9]') 

這將迫使只接受一個4位數字...

+0

'LIKE'通常不接受正則表達式... –

+0

Microsoft SQL確實支持上述操作,並且我相信大多數其他SQL方言都支持類似的東西... – Sparky

+0

不錯,我不知道有關SQL Server ...通常,'LIKE'子句僅限於通配符:'%'和'_' –

4

這種問題,在某些場景(即排序)中存儲需要被視爲數字值的零前導數字以及作爲其他地方(即地址)中的文本值始終是一種痛苦,並且沒有一個答案對所有人都是最好的ERS。在我的公司,我們有一個數據庫,將數字存儲爲代碼文本(不是Medicare APC代碼),我們必須用零填充它們,以便在訂單操作中使用它們時可以正確排序。

,因爲該項目是不使用數字字符一個真實的數字,但文本數據,不要使用數字數據類型此。您不會對代碼執行任何計算或聚合,因此將它們存儲爲數字的唯一好處是確保對代碼進行正確排序,並且可以使用以文本形式存儲的代碼,並在需要時用零填充。如果你起訴一個數字數據類型,那麼無論何時代碼與其他文本值相結合,你都必須將它明確地轉換爲CHAR/VARCHAR或讓SQL Server執行它,因爲總是應該避免隱式轉換,這意味着需要大量的額外工作你和任何時候使用代碼的查詢處理器。

假設您決定使用文本數據類型,那麼問題是應該使用VARCHAR還是CHAR,而許多發佈了VARCHAR的用戶會建議您將CHAR設置爲4的長度。爲什麼?

VARCHAR數據類型用於預先未知大小(字符的長度或數量)的文本數據。對於這個醫療保險代碼,我們知道在可預見的將來,這個長度總是至少4,並且可能不超過4。 SQL Server在CHAR和VARCHAR之間處理數據的存儲方式不同。 SQL Server的BOL(圖書在線)說:

使用CHAR時當列數據的大小差異很大列數據項的大小一致

使用VARCHAR。

對於SQL Server 2008及以上版本,我不能說確實如此,但對於早期版本,VARCHAR數據類型的使用在表中具有每列每列數據1字節的額外開銷一個VARCHAR數據類型。如果存儲的數據總是相同的大小,並且在您的情況下聽起來像是這樣,那麼這個額外的字節是浪費。

最後,由您決定是更喜歡CHAR還是VARCHAR,但絕對不要使用數字數據類型來存儲固定長度的代碼。

0
在TSQL

check(isnumeric(APC_ODE) = 1) 
+1

請您詳細說明這是做什麼 – MZaragoza

+0

iam引用此功能https://docs.microsoft.com/en-us/sql/t -sql/functions/isnumeric-transact-sql如果value是int或decimal,它將返回1,因此這個檢查約束將只允許插入數字值,現在是否清除? – Muflix