select *
from folder f,uploads u
where u.id=f.folderId
and FIND_IN_SET('8', '15,9,13,27')
请告诉我相当于预定义或用户定义的postgresql函数
答案 0 :(得分:8)
您不应该首先存储逗号分隔值,但您可以执行以下操作:
select *
from folder f
join uploads u ON u.id = f.folderId
where '8' = ANY (string_to_array(some_column,','))
string_to_array()
根据传递的分隔符
答案 1 :(得分:0)
select *
from folder f,uploads u
where u.id=f.folderId and '8' in('15','9','13','27')
答案 2 :(得分:0)
MySQL中的FIND_IN_SET()
函数 - 毫不奇怪 - 适用于集合。 PostgreSQL中的MySQL SET
相当于enum
type,在实现方面存在一些细微差别。
FIND_IN_SET()
函数返回集合中项目的索引,如果集合中不存在,则返回0。这在逻辑上是不合情理的:"a set is an abstract data type that can store certain values, without any particular order, and no repeated values"。 PostgreSQL没有内置的方法来查找enum
类型的项目的顺序,它甚至没有办法找出如果字符串也是一个项目enum
类型。这就是应该如何。
如果您在较少限制的意义上使用字符串的“集合”,则可能需要为列使用text[]
数据类型。假设您只测试数组中是否存在值,那么您的查询就会变为:
SELECT *
FROM folder f
JOIN uploads u ON u.id = f.folderId
WHERE '8' = ANY (text_array_column);
如果您想在文本数组列中使用'8'
的特定索引,则应在问题中指定要对其执行的操作;使用当前信息,更好的答案是不可能的。