如何創建一個欄位為 99% INT 的表;1% STR 值?
我正在 PostgreSQL 中創建一個表並尋找我應該遵循的最佳方法。
我的一個欄位主要由整數值組成。但真的大部分。
像:
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 and over
最後一個,20歲及以上,殺死一切。如果它不存在,我將使用整數欄位創建該表。
VARCHAR(11)
我應該僅僅因為 1% 字元串欄位而創建類型欄位嗎?或者有沒有其他方法可以順利解決這個問題?
顯然,您想儲存某種範圍,其中大多數範圍只包含一個元素,其中一個是開放式的。
你沒有解釋你想如何使用這些值*。*
如果您僅將它們用於顯示目的,並且在任何情況下(永遠!)都不必對它們進行任何計算,那麼一
text
列可能就足夠了。但是,從長遠來看,我從未遇到過不打算將數字視為數字的情況。
根據您使用這些值的方式,我可以想到兩種解決方案:要麼使用大多數範圍僅包含單個元素的範圍類型。這是否有意義取決於您使用該值的方式。也許這 20 個單個值實際上意味著從 1 到 20 的範圍 - 很難從你的問題中分辨出來
或者使用兩列:一列整數,一列表示“及以上”。如果您只能在“正是該值”和“該值及以上”之間進行選擇,我可能會使用一
boolean
列來指示該值是范圍的下限。
我強烈建議您盡可能使用最合適的數據類型 - 如果數據是整數,則使用整數類型!
你想要 PostgreSQL 的
generate_series
此程式碼將根據需要生成 0 到 20 之間的隨機整數。
SELECT (20 * random())::INTEGER AS rand FROM generate_series(1, 10);
結果 -
rand 0 15 2 10 14 14 10 0 18 18
看這裡的小提琴!您可以將第二個參數更改為適合您的任何值!
要生成隨機文本,您可以使用以下程式碼:
SELECT MD5(random()::TEXT) FROM GENERATE_SERIES(1, 5);
結果:
md5 de5161e6ed7492d046d02bfc5c166c86 a8818e4e472c4a8a923abf2c9e97a70c 398300e6a10e4c493b64403adeeac3c7 bf548d3db7763e11ee05e41ab0f2b3d9 c914d60c26a5c75fa794ef119ed70c10
要僅生成文本,您可以使用
REPLACE
和/或TRANSLATE
函式將 MD5 數值數據更改為空字元串。在這裡、這里和這裡可以找到很多好的“技巧” 。最好的不過是
REGEXP_REPLACE
功能。你可以這樣做:WITH cte AS ( SELECT MD5(random()::TEXT) AS rand FROM GENERATE_SERIES(1, 5) ) SELECT REGEXP_REPLACE(rand,'[[:digit:]]','','g') AS letters FROM cte
結果:
letters addebafaeb ccdfaddbdccadc debdbdfabefbeff debdaecabef ebfbaeefdbc
ps 歡迎來到論壇!