2011-03-28 97 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