PHP Postgres JOIN与LIKE查询失败

时间:2012-10-08 23:55:09

标签: php zend-framework postgresql

我试图用postgres找出一个查询,我不确定它的原因我习惯了mysql而postgres没有LIKE查询。或者我的交易是什么。无论哪种方式,我知道它不工作,我不知道为什么不。有人可以帮我指出正确的方向吗?我的意思是最终我正在尝试创建此查询的Zend数据库版本,但这是我在尝试使用zend db类构建它之前尝试创建的核心查询。

SELECT 
    org.orgid, 
    org.roleid, 
    users.userid, 
    users.email, 
    users.first_name, 
    users.last_name, 
    users.contact_id, 
    users.state, 
    users.ts, 
    users.altemail, 
    users.unboundid, 
    users.blocked 
FROM mapping AS org 
INNER JOIN my_users AS users ON org.userid = users.userid
WHERE (org.orgid = 'generated-id')
AND (org.roleid LIKE 'partner-%');



ERROR:  operator does not exist: roles ~~ unknown
LINE 17: AND (org.roleid LIKE 'partner-%');
                          ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

1 个答案:

答案 0 :(得分:1)

更改

AND (org.roleid LIKE 'partner-%');

AND (org.roleid::text LIKE 'partner-%');

显然你正在研究roleid的文本表示。这似乎应该可以正常工作,除非您的数据类型不匹配。通过转换为文本,您可以确保它们可以。

请注意,一个重要的分支是roleid上的索引对于这样的比较将是无用的,因为它们的操作与该类型不直接兼容。这应该不是问题,因为orgid仍然可以使用索引但是需要考虑。如果你想解决这个问题,你可能想要使用表方法或其他函数来解决这个问题。然后,您可以索引函数输出。

例如,你可以像这样使用表方法:

CREATE FUNCTION is_partner(mapping) returns bool language sql immutable as $$
    SELECT $1.roleid::text LIKE 'partner-%';
$$;

然后您可以使用以下内容对其进行索引:

CREATE INDEX mapping_is_partner_idx ON mapping (is_partner(mapping));

然后您可以从

更改该连接条件
AND (org.roleid LIKE 'partner-%');

AND org.is_partner;

请注意,在这种情况下,org是必需的,无法隐式添加,因为它使用class.method表示法将org.is_oartner更改为is_partner(org)。

希望这有帮助。