select *
from folder f,uploads u
where u.id=f.folderId
and FIND_IN_SET('8', '15,9,13,27')
请告诉我相当于预定义或用户定义的 postgresql 函数
select *
from folder f,uploads u
where u.id=f.folderId
and FIND_IN_SET('8', '15,9,13,27')
请告诉我相当于预定义或用户定义的 postgresql 函数
您不应该首先存储逗号分隔值,但您可以执行以下操作:
select *
from folder f
join uploads u ON u.id = f.folderId
where '8' = ANY (string_to_array(some_column,','))
string_to_array()
根据传递的分隔符将字符串转换为真实数组
MySQL 中的FIND_IN_SET()
函数适用于集合(并不奇怪)。SET
在 PostgreSQL 中相当于 MySQL的是enum
type,在实现上有一些细微差别。
该FIND_IN_SET()
函数返回集合中项目的索引,如果集合中不存在,则返回 0。这在逻辑上是没有意义的:“集合是一种抽象数据类型,可以存储某些值,没有任何特定的顺序,也没有重复的值”。PostgreSQL 没有内置方法来查找enum
类型中项目的顺序,它甚至没有方法来确定字符串是否也是enum
类型中的项目。这就是它应该的样子。
如果您在较少限制的意义上使用字符串“集”,您可能希望text[]
为您的列使用数据类型。然后,您的查询变为,假设您仅测试数组中是否存在值:
SELECT *
FROM folder f
JOIN uploads u ON u.id = f.folderId
WHERE '8' = ANY (text_array_column);
如果您想要'8'
文本数组列中的特定索引,您应该在问题中指定您想用它做什么;根据目前的信息,不可能有更好的答案。
select *
from folder f,uploads u
where u.id=f.folderId and '8' in('15','9','13','27')