我试图弄清楚查询 1 还是 2 是否更优化,并且似乎在我的 WHERE 子句中包含我的条件比在我的 JOIN 子句中更优化:
-- 1) "ups" inside where clause
explain analyze select * from item_events LEFT JOIN "carriers" ON "carriers"."item_event_id" = "item_events"."id" WHERE "carriers"."carrier_name" = 'ups' and "item_events"."property_id" = 895;
-- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Gather (cost=1157.49..41948.17 rows=2721 width=381) (actual time=35.650..1832.871 rows=3933 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Nested Loop (cost=157.49..40676.07 rows=1134 width=381) (actual time=34.171..1824.416 rows=1311 loops=3)
-> Parallel Bitmap Heap Scan on item_events (cost=157.05..16828.84 rows=1969 width=286) (actual time=30.920..368.885 rows=1819 loops=3)
Recheck Cond: …Run Code Online (Sandbox Code Playgroud) 我试图了解我是否可以删除“postgres”角色,或者至少将其作为超级用户删除。谢谢!
我的数据库中存储了不同的电话格式,例如:
727.170.4799
1-416-958-6390
1.561.374.4268
(813) 929-5892
Run Code Online (Sandbox Code Playgroud)
此表中大约有约 200 万条记录,因此修改需要很长时间。我需要通过执行电话查找来查找记录。
我控制的一件事是输入,我可以保证它将是数字。但是我不知道他们是否要输入带有或不带有国家/地区代码的数字,因此以这个数字为例,1-416-958-6390这两个都用于查找:
14169586390
4169586390
Run Code Online (Sandbox Code Playgroud)
应该返回同一行 ( 1-416-958-6390)
如何尽可能高效地拨打电话号码?
这是我得到的,但它超级慢(正如预期的那样):
select * from patients
WHERE ( REPLACE(phone_number, '-', '') LIKE '%4169586390' )
Run Code Online (Sandbox Code Playgroud) 我有这个查询:
SELECT * FROM table ORDER BY label ASC;
Run Code Online (Sandbox Code Playgroud)
由于标签不是英文的,它们没有按正确的顺序排序(以“ö”开头的标签不在底部/末尾)。
因此,我尝试:
SELECT * FROM table ORDER BY label COLLATE "sv-SE" ASC;
SELECT * FROM table ORDER BY label COLLATE "sv_SE" ASC;
Run Code Online (Sandbox Code Playgroud)
这些给出了关于那些不存在的排序规则的错误,这让我感到困惑。
经过一番搜索,我想出了这样做:
SELECT * FROM pg_collation;
Run Code Online (Sandbox Code Playgroud)
这表明它应该是:
sv-SE-x-icu
Run Code Online (Sandbox Code Playgroud)
当我使用该标识符时它起作用了,但是“-x-icu”的东西有什么用?那是怎么回事?我讨厌他们总是不得不弄乱标准的语言环境标识符,所以你永远不能只依赖标准的“language_location”格式。
postgresql collation unicode international-components-unicode
我知道我可以用这个列出所有序列:
SELECT * FROM information_schema.sequences;
Run Code Online (Sandbox Code Playgroud)
但我需要知道这个序列被哪个表使用。
我想这样做的原因是为了找出哪些PRIMARY KEYs序列不是默认格式的table_name_id_seq
这可能吗?
注意:我的 PostgreSQL 版本是 11.5。
我将 AWS RDS 用于带有 PGAdmin 的 PostgreSQL 11 数据库。我存储每一行的创建日期,now()::timestamp用于存储没有时区的日期和时间。问题是存储的时间永远不是我想要的值 ( UTC+05:30)。
如果我设定的参数timezone为UTC在RDS,然后储存时间的背后是印度时间5:30小时,但如果我设置UTC + 05:30,它存储时间背后要么11小时或1小时以上,这种情况随机随机行。我没有改变任何其他东西,只是这个timezone参数。
我搜索了很多,但没有找到任何类似的答案。
我收到此错误:
当我尝试执行以下查询时出现:
with expensive_service as (
select s1.*
from service s1, service s2
where s1.price > s2.price
)
select *
from service except expensive_service;
Run Code Online (Sandbox Code Playgroud)
我试图实现WITH ... AS(链接到 PostgreSQL 文档)。
此查询为我提供了所需的输出:
select *
from service except (
select s1.*
from service s1, service s2
where s1.price > s2.price
)
Run Code Online (Sandbox Code Playgroud)
任何指导我错误所在的帮助将不胜感激!
timestamp我用一列来指示一行是在白天还是晚上创建的。我的代码如下,但由于某种原因,我只得到“DAY”作为结果。我没有正确格式化值吗?
select record_id, rec_date,
case when date_part('hour', rec_date) between 20 and 07 then 'Night'
else 'Day' end as Indicator
from records;
Run Code Online (Sandbox Code Playgroud)
该rec_date列是一个时间戳,我可以在其中看到诸如2019-11-20 21:34:02.000000- 之类的值,它应该得到一个'Night'指标。
在 PostgreSQL 11 中,以下表达式
UPDATE test_table SET ("column_a","column_b") = ('value-a','value-b') WHERE "column_a" = 'value-c'
Run Code Online (Sandbox Code Playgroud)
被接受并执行更新。
但是对于单个列/值,例如
UPDATE test_table SET ("column_a") = ('value-a') WHERE "column_a" = 'value-c'
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误。ROW必须提供,例如
UPDATE test_table SET ("column_a") = ROW ('value-a') WHERE "column_a" = 'value-c'
Run Code Online (Sandbox Code Playgroud)
有没有解释为什么选择这种行为?如果ROW缺少,是否有歧义?
我需要修复 Postgresql 数据库中的一些数据问题,其中主要是从文本列中修剪空格。我正在使用如下语句执行此操作:
UPDATE app.products
SET "description" = TRIM(BOTH FROM "description")
Run Code Online (Sandbox Code Playgroud)
在测试数据库上发出这个返回UPDATE 2000. 测试表包含 2000 行,其中只有 1 行实际上会随着空白修剪而改变。这是否会导致 Postgres 创建新的、不必要的元组?添加 WHERE 子句会有好处吗?大多数目标列都没有编入索引。
UPDATE app.products
SET "description" = TRIM(BOTH FROM "description")
WHERE "description" LIKE ' %' OR "description" LIKE '% '
Run Code Online (Sandbox Code Playgroud) postgresql ×10
collation ×1
cte ×1
date ×1
date-format ×1
date-math ×1
except ×1
international-components-unicode ×1
query ×1
role ×1
row ×1
syntax ×1
timezone ×1
unicode ×1