4
select * 
from folder f,uploads u 
where u.id=f.folderId 
and FIND_IN_SET('8', '15,9,13,27')

请告诉我相当于预定义或用户定义的 postgresql 函数

4

3 回答 3

15

您不应该首先存储逗号分隔值,但您可以执行以下操作:

select * 
from folder f
  join uploads u ON u.id = f.folderId 
where '8' = ANY (string_to_array(some_column,','))

string_to_array()根据传递的分隔符将字符串转换为真实数组

于 2016-02-03T08:16:18.277 回答
0

MySQL 中的FIND_IN_SET()函数适用于集合(并不奇怪)。SET在 PostgreSQL 中相当于 MySQL的是enumtype,在实现上有一些细微差别。

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'文本数组列中的特定索引,您应该在问题中指定您想用它做什么;根据目前的信息,不可能有更好的答案。

于 2016-02-03T08:07:54.080 回答
0
    select * 
       from folder f,uploads u 
          where u.id=f.folderId and '8' in('15','9','13','27')
于 2016-02-03T07:00:52.547 回答