相关疑难解决方法(0)

PostgreSQL可以索引数组列吗?

我在文档中找不到这个问题的明确答案.如果列是数组类型,是否会对所有输入的值进行单独索引?

我创建了一个包含一int[]列的简单表,并在其上放置了一个唯一索引.我注意到我无法添加相同的整数数组,这使我相信索引是数组项的组合,而不是每个项的索引.

INSERT INTO "Test"."Test" VALUES ('{10, 15, 20}');
INSERT INTO "Test"."Test" VALUES ('{10, 20, 30}');

SELECT * FROM "Test"."Test" WHERE 20 = ANY ("Column1");
Run Code Online (Sandbox Code Playgroud)

索引是否有助于此查询?

arrays postgresql indexing

132
推荐指数
3
解决办法
7万
查看次数

PostgreSQL中的IN vs ANY运算符

PostgreSQL中INANY运算符有什么区别?
两者的工作机制似乎是一样的.任何人都能用一个例子来解释这个吗

sql database postgresql rdbms sql-in

83
推荐指数
2
解决办法
7万
查看次数

用于在JSON数组中查找元素的索引

我有一个看起来像这样的表:

CREATE TABLE tracks (id SERIAL, artists JSON);

INSERT INTO tracks (id, artists) 
  VALUES (1, '[{"name": "blink-182"}]');

INSERT INTO tracks (id, artists) 
  VALUES (2, '[{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]');
Run Code Online (Sandbox Code Playgroud)

还有其他几个与此问题无关的列.将它们存储为JSON是有原因的.

我要做的是查找具有特定艺术家姓名(完全匹配)的曲目.

我正在使用此查询:

SELECT * FROM tracks 
  WHERE 'ARTIST NAME' IN
    (SELECT value->>'name' FROM json_array_elements(artists))
Run Code Online (Sandbox Code Playgroud)

例如

SELECT * FROM tracks
  WHERE 'The Dirty Heads' IN 
    (SELECT value->>'name' FROM json_array_elements(artists))
Run Code Online (Sandbox Code Playgroud)

但是,这会进行全表扫描,并且速度不是很快.我尝试使用函数创建GIN索引names_as_array(artists)并使用'ARTIST NAME' = ANY names_as_array(artists),但是不使用索引并且查询实际上明显更慢.

sql postgresql indexing json jsonb

74
推荐指数
1
解决办法
5万
查看次数

PL/pgSQL检查是否存在行

我正在PL/pgSQL中编写一个函数,我正在寻找检查行是否存在的最简单方法.
现在我正在选择一个integer进入a boolean,这不起作用.我对PL/pgSQL还没有足够的经验知道最好的方法.

这是我的功能的一部分:

DECLARE person_exists boolean;
BEGIN

person_exists := FALSE;

SELECT "person_id" INTO person_exists
  FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;

IF person_exists THEN
  -- Do something
END IF;

END; $$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

更新 - 我现在正在做这样的事情:

DECLARE person_exists integer;
BEGIN

person_exists := 0;

SELECT count("person_id") INTO person_exists
  FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;

IF person_exists < 1 THEN
  -- Do something
END IF;
Run Code Online (Sandbox Code Playgroud)

sql postgresql exists plpgsql postgresql-9.1

42
推荐指数
2
解决办法
8万
查看次数

Postgres:检查数组字段是否包含值?

我确定这是一个重复的问题,因为某个地方有答案,但是谷歌搜索10分钟后我找不到答案,所以我要求编辑不要关闭它它可能对其他人有用的基础.

我正在使用Postgres 9.5.这是我的表:

        Column          ?           Type            ?                                Modifiers
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
 id                      ? integer                   ? not null default nextval('mytable_id_seq'::regclass)
 pmid                    ? character varying(200)    ?
 pub_types               ? character varying(2000)[] ? not null
Run Code Online (Sandbox Code Playgroud)

我想在"Journal"中找到所有行pub_types.

我找到了文档和Google搜索,这就是我尝试过的:

select * from mytable where ("Journal") IN pub_types;
select * from mytable where "Journal" IN pub_types;
select * from mytable where pub_types=ANY("Journal");
select * from mytable where pub_types IN ("Journal");
select * from mytable where where pub_types contains "Journal";
Run Code Online (Sandbox Code Playgroud)

我已经扫描了postgres数组文档,但是看不到一个如何运行查询的简单示例,而StackOverflow问题似乎都是基于更复杂的示例.

postgresql

34
推荐指数
4
解决办法
4万
查看次数

PostgreSQL可以对数组元素有唯一性约束吗?

我正在尝试为当前在LDAP存储中的主机数据提出PostgreSQL架构.部分数据是机器可以拥有的主机名列表,该属性通常是大多数人用来查找主机记录的关键.

我想将这些数据移动到RDBMS的一件事是能够在hostname列上设置唯一性约束,以便无法分配重复的主机名.如果主机只能有一个名称,这将很容易,但由于它们可以有多个名称,因此它更复杂.

我意识到这样做的完全规范化的方法是让一个主机名表的外键指向hosts表,但是我想避免让每个人都需要为最简单的查询做连接:

select hostnames.name,hosts.*
  from hostnames,hosts
 where hostnames.name = 'foobar'
   and hostnames.host_id = hosts.id;
Run Code Online (Sandbox Code Playgroud)

我认为使用PostgreSQL数组可以为此工作,它们肯定使简单的查询变得简单:

select * from hosts where names @> '{foobar}';
Run Code Online (Sandbox Code Playgroud)

但是,当我在hostnames属性上设置唯一性约束时,它当然会将整个名称列表视为唯一值而不是每个名称.有没有办法让每个名称在每一行都是唯一的?

如果没有,有没有人知道另一种更有意义的数据建模方法?

arrays postgresql database-design ldap unique-constraint

19
推荐指数
2
解决办法
6956
查看次数

在Postgres中搜索整数数组

有没有其他方法可以integer[]在Postgres 的列中搜索某个值?

我目前安装的Postgres版本并没有让下面的语句:

SELECT * FROM table WHERE values *= 10;
Run Code Online (Sandbox Code Playgroud)

数组示例:

'{11043,10859,10860,10710,10860,10877,10895,11251}'
'{11311,10698,10697,10710,10712,10711,10708}'
Run Code Online (Sandbox Code Playgroud)

该语句应返回数组包含的每一行'10710'.

sql arrays postgresql

17
推荐指数
2
解决办法
2万
查看次数

如何在带有Rails的WHERE子句中使用ANY而不是IN?

我曾经有过如下查询:

MyModel.where(id: ids)
Run Code Online (Sandbox Code Playgroud)

哪个生成sql查询如:

SELECT "my_models".* FROM "my_models"
WHERE  "my_models"."id" IN (1, 28, 7, 8, 12)
Run Code Online (Sandbox Code Playgroud)

现在我想改为使用ANY而不是IN.我创造了这个:

MyModel.where("id = ANY(VALUES(#{ids.join '),('}))"
Run Code Online (Sandbox Code Playgroud)

现在,当我使用空数组时,ids = []我得到以下错误:

MyModel Load (53.0ms)  SELECT "my_models".* FROM "my_models"  WHERE (id = ANY(VALUES()))
ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
Position: 75: SELECT "social_messages".* FROM "social_messages"  WHERE (id = ANY(VALUES()))
    from arjdbc/jdbc/RubyJdbcConnection.java:838:in `execute_query'
Run Code Online (Sandbox Code Playgroud)

sql postgresql activerecord ruby-on-rails-3 ruby-on-rails-4

11
推荐指数
1
解决办法
1万
查看次数

检查Postgres数组中是否存在NULL

此问题类似,如何查找数组中是否存在NULL值?

这是一些尝试.

SELECT num, ar, expected,
  ar @> ARRAY[NULL]::int[] AS test1,
  NULL = ANY (ar) AS test2,
  array_to_string(ar, ', ') <> array_to_string(ar, ', ', '(null)') AS test3
FROM (
  SELECT 1 AS num, '{1,2,NULL}'::int[] AS ar, true AS expected
  UNION SELECT 2, '{1,2,3}'::int[], false
) td ORDER BY num;

 num |     ar     | expected | test1 | test2 | test3
-----+------------+----------+-------+-------+-------
   1 | {1,2,NULL} | t        | f     |       | t
   2 | {1,2,3}    | f        | f …
Run Code Online (Sandbox Code Playgroud)

sql arrays postgresql null postgresql-9.1

11
推荐指数
1
解决办法
4945
查看次数

SQLAlchemy:如何过滤PgArray列类型?

在纯粹的postgres我们可以写:

SELECT * FROM my_table WHERE 10000 = ANY (array_field);
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * FROM my_table WHERE 10000 = ALL (array_field);
Run Code Online (Sandbox Code Playgroud)

如何在没有原始sql的sqlalchemy的帮助下做同样的事情?

python sql postgresql sqlalchemy

6
推荐指数
1
解决办法
7990
查看次数