【发布时间】:2017-11-13 19:35:24
【问题描述】:
所以我从 Python 网络服务器获得了一个数组 codes,我需要选择所有行,其列与这些 codes 中的任何一个匹配:
SELECT a.*
FROM a
LEFT JOIN b ON b.code = a.bcode
WHERE b.code = ANY(codes);
但问题是,这些代码可能只是部分代码,只是代码的开头。因此,虽然完整的代码总是 5 个字母长(它们存储为字符串),但我收到的代码数组可能类似于 ['01', '4332', '34443']。如果b 中的一行将'01233' 作为列的值,它应该与数组中的'01' 匹配。请注意,它不会匹配到'23',它应该只匹配到开头。
本质上我想要这样的东西:
SELECT a.*
FROM a
LEFT JOIN b ON b.code = a.bcode
WHERE b.code LIKE ANY(codes || '%');
显然附加到 codes || '%' 这样的数组是不合法的,那我该怎么做呢?
【问题讨论】:
-
获得部分匹配是否总是可以,还是应该完全匹配 5 个字符的代码?这些列中的数据也是文本、整数等吗?
-
@eurotrash 我不确定你的第一个问题是什么意思。我存储的代码长度为 5 个字符,因此
'01234%'可以作为部分代码,因为它只会匹配'01234'。数据始终以文本形式出现,无处不在,因为前导零很重要(即04123与41230,只有后者会部分匹配4123)。 -
@eurotrash “部分”是指匹配开头。所以代码中有
'01'是不够的,它必须以'01'开头(假设我在输入数组中有'01') -
WHERE b.code LIKE ANY(select unnest(codes) || '%');
标签: sql arrays postgresql postgresql-9.5