2017-05-05 106 views
1

我使用Postgresql來存儲Ruby gem版本號。我想在用戶提供的自定義謂詞和基本版本上過濾這些版本,爲此我將這兩個版本轉換爲整數數組(以便於比較):4.2.0變爲'{4,2,0}'比較Postgresql中不同長度的數組

這工作得很好:

'{4,0,0}' < '{4,1,0}' # yields TRUE 

不過,我有問題時,數組的長度是不同的:

'{4}' < '{5,0,0}' # yields TRUE 
'{4,1,2}' < '{4,1}' # also yields TRUE when it should be FALSE 

我找不到文檔中與此相關的具體問題任何事情。我怎樣才能實現我所追求的目標?如果具有較少元素的數組會得到正確的填充(這會導致我期望的行爲),那將會很棒。

+1

不確定你的意思是「數組」,而是選擇'{4,1,2}':: int [] <'{4,1}':: int [];'產生'FALSE'。 .. – Abelisto

+0

哦,我,我一定很累。感謝您指出了這一點!你可以爲它添加一個答案。 – linkyndy

+0

讓我們認爲這只是一個錯字:o)祝你好運。 – Abelisto

回答

0

一種方法是標準化所有版本的數組長度,例如當您進行數組轉換'{4,1}'時爲'{4,1,0}'

可以檢查每一個數組中的元素轉換後的使用array_length(array,dimension)的數目(在這種情況下dimension爲1),然後使用附加 array_append(array, element)(在這種情況下,element是0)的一個或兩個零取決於返回的值。

然後當你做出比較:
'{4,0,0}' < '{5,0,0}' # will still yield TRUE '{4,1,2}' < '{4,1,0}' # will now correctly yield FALSE

編輯:如下面評論的,這僅僅是的情況下原始陣列的每個元素是由一個位整數或數字字符的。由於整個字符串正在進行比較,如果字符串的數字元素長度超過單個字符,它可能會失敗。

+0

但是'select'{40,1,2}'<'{4,1,0}';'產生'TRUE':o) – Abelisto

+0

'{1,2,3}'實際上與整數沒有任何關係,它只是包含一些內容的字符串。很顯然,OP和你還試圖比較兩個字符串,而不是兩個數組......(提示:請參閱我的意見下的問題) – Abelisto

+0

我只考慮原始數組的每個元素由單個數字整數或數字字符。由於整個字符串正在進行比較,如果字符串的數字元素長度超過單個字符,它可能會失敗,因爲@Abelisto已經注意到了。 –