2011-03-28 92 views
1

我正在使用mysql函數XOR(^)和BIT_COUNT()的Ruby應用程序。不過,我現在需要在運行PyGreSQL的Heroku上運行應用程序。將此MySQL查詢翻譯成PyGreSQL

我找不到任何可以幫助我的PyGreSQL的文檔。

那麼任何人都可以翻譯這個mysql查詢,以便它可以在pygresql數據庫上執行時工作嗎?

SELECT * FROM "photos" WHERE BIT_COUNT(phash^2061756291569501157) <= 15 

pygresql給我的錯誤

ERROR: operator does not exist: text^bigint 

感謝。

+0

'#'是按位異或。 (請參閱http://www.postgresql.org/docs/7.4/static/functions-math.html)我不確定是否有'bit_count()'的確切並行。 – syrion 2011-03-28 13:20:04

+0

啊,有。在這裏你去:http://stackoverflow.com/questions/1910369/total-number-of-1s-in-a-postgres-bitmask – syrion 2011-03-28 13:22:21

+0

有用的提示:稱爲'PostgreSQL'。 PyGreSQL只是Postgres的Python模塊。除非該模塊有特定的內容,否則您將看到來自Postgres用戶的更多幫助。相同的用戶不會將它稱爲Perl的'DBD :: Pg',除非問題與該模塊有關,而不是基礎數據庫/查詢。 – vol7ron 2011-03-28 13:32:20

回答

2
SELECT * 
FROM photos 
WHERE (
     SELECT SUM(((phash::bigint # 2061756291569501157) >> bit) & 1) 
     FROM generate_series(0, 63) bit 
     ) <= 15 
+0

如果我正在異或的整數是BIGINT UNSIGNED(> 0,<2^64 - 1),我該怎麼做?像2061756291569501157和17418945696623429624 – 2011-03-28 16:52:21

+0

@Shea:不幸的是,PostgreSQL不支持無符號類型。你可以用這種方法檢查最後的63位,並添加一個額外的條件來檢查符號。 – Quassnoi 2011-03-28 16:56:54