我在文档中找不到这个问题的明确答案.如果列是数组类型,是否会对所有输入的值进行单独索引?
我创建了一个包含一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)
索引是否有助于此查询?
我确定这是一个重复的问题,因为某个地方有答案,但是谷歌搜索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问题似乎都是基于更复杂的示例.
我曾经有过如下查询:
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) 与此问题类似,如何查找数组中是否存在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) 为了放弃阅读整个问题,我的基本问题是:
PostgreSQL中是否有一个函数来转义字符串中的正则表达式字符?
我已经探测过文档,但无法找到这样的功能.
这是完整的问题:
在PostgreSQL数据库中,我有一个包含唯一名称的列.我还有一个定期在此字段中插入名称的进程,并且为了防止重复,如果需要输入已存在的名称,它会在末尾附加一个空格和括号.
即姓名,姓名(1),姓名(2),姓名(3)等
就目前而言,我使用以下代码来查找要在系列中添加的下一个数字(用plpgsql编写):
var_name_id := 1;
SELECT CAST(substring(a.name from E'\\((\\d+)\\)$') AS int)
INTO var_last_name_id
FROM my_table.names a
WHERE a.name LIKE var_name || ' (%)'
ORDER BY CAST(substring(a.name from E'\\((\\d+)\\)$') AS int) DESC
LIMIT 1;
IF var_last_name_id IS NOT NULL THEN
var_name_id = var_last_name_id + 1;
END IF;
var_new_name := var_name || ' (' || var_name_id || ')';
Run Code Online (Sandbox Code Playgroud)
(var_name
包含我试图插入的名称.)
这暂时有效,但问题出在WHERE
声明中:
WHERE a.name LIKE var_name || ' (%)'
Run Code Online (Sandbox Code Playgroud)
此检查不会验证有%
问题的数字,并且它不会考虑多个括号,如"Name((1))",如果存在任何一种情况,则会抛出强制转换异常.
该WHERE
声明确实需要像更多的东西: …
我想使用Postgres对地址进行一些基本的地理编码.我有一个地址表,有大约100万个原始地址字符串:
=> \d addresses
Table "public.addresses"
Column | Type | Modifiers
---------+------+-----------
address | text |
Run Code Online (Sandbox Code Playgroud)
我还有一张位置数据表:
=> \d locations
Table "public.locations"
Column | Type | Modifiers
------------+------+-----------
id | text |
country | text |
postalcode | text |
latitude | text |
longitude | text |
Run Code Online (Sandbox Code Playgroud)
大多数地址字符串包含邮政编码,所以我的第一次尝试是做类似和横向连接:
EXPLAIN SELECT * FROM addresses a
JOIN LATERAL (
SELECT * FROM locations
WHERE address ilike '%' || postalcode || '%'
ORDER BY LENGTH(postalcode) DESC
LIMIT 1
) AS l ON …
Run Code Online (Sandbox Code Playgroud) postgresql indexing query-optimization nearest-neighbor postgresql-9.4
(最初是这个问题的一部分,但它有点无关紧要,所以我决定把它作为自己的问题.)
我找不到运营商~<~
是什么.Postgres的手册只提到 ~
和类似的运营商在这里,但没有迹象~<~
.
在psql控制台中摆弄时,我发现这些命令会产生相同的结果:
SELECT * FROM test ORDER BY name USING ~<~;
SELECT * FROM test ORDER BY name COLLATE "C";
Run Code Online (Sandbox Code Playgroud)
这些给出了相反的顺序:
SELECT * FROM test ORDER BY name USING ~>~;
SELECT * FROM test ORDER BY name COLLATE "C" DESC;
Run Code Online (Sandbox Code Playgroud)
还有关于代字号运算符的一些信息:
\do ~*~
List of operators
Schema | Name | Left arg type | Right arg type | Result type | Description
------------+------+---------------+----------------+-------------+-------------------------
pg_catalog | ~<=~ | character | …
Run Code Online (Sandbox Code Playgroud)