2014-07-21 22 views
0

我得到了一個名爲companies的表和一個名爲employees的列,它是一個字符串列。 我這裏條件去找尋其中有10和100之間的員工公司:Rails/Postgres將字符串列視爲整數

where("companies.employees >= ? AND companies.employees <= ?", 10, 100) 

的問題是:該列需要保持一個字符串列,所以我不能只是把它轉換成整數,但我也想比較員工數量。有沒有辦法做到這一點?

+4

使用強制轉換。但真的,這是可怕的數據庫建模,將整數存儲在字符串列中。 –

+0

我知道這不是一般的正確方法,但目前我沒有其他選擇。我知道演員陣容是正確的選擇,但我似乎無法獲得正確的語法。你能用正確的語法回答這個問題嗎? –

回答

0

這可能工作,它是紅寶石的問題,我不知道紅寶石:-)在Postgres裏克雷格說,這樣我會寫查詢:

select * from companies where employees::integer >= 10 and employees::integer <= 100; 

(當然有替代,等等,但是這個概念得到了解決,當你在postgres中沒有使用正確的類型時,你遇到的一個問題是索引不能正確工作,因爲你正在將僱員轉換爲整數類型,必須獲取每條記錄,將其轉換爲一個整數,然後使用大於/小於的東西進行過濾。表中的每條記錄都將被提取,轉換,然後進行比較。如果這是一個整數類型,並且有一個索引放在桌面上,那麼postgres引擎可以做得更好通過只選擇相關的記錄來保證明智。反正...

你的Ruby可能工作修改如下:

where("companies.employees::integer >= ? AND companies.employees::integer <= ?", 10, 100) 

但是,這讓我好奇的替代。如果類型是從參數的類型中收集的,那麼它可能會起作用,因爲10和100顯然是整數。如果置換會很奇怪,你也許可以做到這一點:

where("companies.employees::integer >= cast(? as integer) AND companies.employees::integer <= cast(? as integer)", 10, 100) 

您可以使用語法整個查詢,以及:

where("cast(companies.employees as integer) >= cast(? as integer) AND cast(companies.employees as integer) <= cast(? as integer)", 10, 100) 

其中一個變種可能會奏效。祝你好運。

-g