我试图用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.
答案 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)。
希望这有帮助。