0

我正在尝试用 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.
4

1 回答 1

1

改变

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

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

显然,您正在处理角色标识的文本表示。这似乎应该可以正常工作,除非您的数据类型不匹配。通过转换为文本,您可以确保他们这样做。

请注意,一个重要的后果是,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)。

希望这可以帮助。

于 2012-10-09T00:51:25.597 回答