我在我的數據庫中有一個記錄,其中有一個時間元素是一個存儲爲字符串的數字。 我想運行一個where查詢,我檢查數字是否大於x Activerecord query .where string as number
Recording.where("recording_duration_ms.to_i > 60000")
當然它必須是簡單的事......
我在我的數據庫中有一個記錄,其中有一個時間元素是一個存儲爲字符串的數字。 我想運行一個where查詢,我檢查數字是否大於x Activerecord query .where string as number
Recording.where("recording_duration_ms.to_i > 60000")
當然它必須是簡單的事......
PSQL存儲的一切作爲一個字符串,所以你需要大約60000單引號:
Recording.where(「recording_duration_ms.to_i>」 60000' 「)
(我認爲)
(1)PostgreSQL不會將所有內容都存儲爲字符串。 (2)'.to_i'是一個Ruby方法調用,不是SQL。 (3)字符串比較不像數字比較那樣工作,例如「2」>「10」是真的。 –
大多數SQL數據庫允許你CAST
值不同的數據類型。最有可能做你想要的查詢是:
Recording.where('CAST(recording_duration_ms AS INT) > 60000')
完善該@Alex Peachey給出了答案......
要avoid SQL injection,你要爲使用?
或hash
Recording.where("CAST(recording_duration_ms AS INT) > ?", 60000)
或
Recording.where("CAST(recording_duration_ms AS INT) > :duration", duration: 60000)
這適用於PostgreSQL的,至少
Recording.where('recording_duration_ms::int > ?', 60000)
爲什麼'recording_duration_ms'存儲爲一個字符串?修復你的模式而不是在它周圍解決問題不是更有意義嗎? –
與@ muistooshort一起,你可以編寫一個遷移任務來獲取所有值,更改列類型(刪除和添加),然後插入字符串作爲整數。如果比現在看到的影響更大,我不會感到驚訝。從那裏你可以使用'Client.where(「recording_duration_to_ms>?」,60000)' –
你應該將整數作爲整數存儲在數據庫中 –