Postgresql

如何創建一個欄位為 99% INT 的表;1% STR 值?

  • May 5, 2020

我正在 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 歡迎來到論壇!

引用自:https://dba.stackexchange.com/questions/266492