是否有性能原因(或其他原因)更喜欢idx
(来自intarray)在array_position
整数列表中查找整数的位置?
我问是因为我们之前使用idx
过array_position
的被添加到 Postgres 中。如果没有性能损失,最好使用内置函数而不是依赖 intarray 扩展。
非常非正式的基准测试表明它具有可比性。PostgreSQL 版本是 13.5。
我尝试使用 psql 函数中的 array_append 将一维数组附加到二维数组。我在声明部分定义count_values
为输出 by out count_values integer[][]
,作为变量,并尝试使用,但弹出错误。cout_value
count_value integer[]
count_values := array_append(count_values, count_value)
function array_append(integer[], integer[]) does not exist
if ...
else
count_value:= array_append(count_value, 0);
end if;
index:= index + 1;
end loop;
count_values:= array_append(count_values, count_value);
end loop;
...
这个问题与 PostgreSQL TOAST 存储和 GIS.SE 问题有关:是否应该为 PostGIS 禁用 TOAST 压缩?
基本上,我想知道对于数组元素的随机访问是否有恒定时间复杂度(O(1))的保证?
也就是说,要获得arr[n]
,最坏情况下的步数是需要一个常数(即O(1)
)还是其他东西(O(log n)
等等)?
我问是因为在某些数据形式(如 PostGIS 线或栅格)中,主要数据在逻辑上是一个(坐标)数组。众所周知,一旦数据量超过一定的限制(如 500 个点),此类数据的访问时间可能会非常长。一个可能的原因是这种大小的数据被传输到 TOAST 存储,并且可能会压缩数据(例如使用main
存储)。目前尚不清楚 PostgreSQL 如何预测元素的大致位置并仍然提供随机访问时间。
大多数编程语言中数组的访问时间是恒定的(O(1)
)。这就是使用数组的意义所在。只是出于好奇:
PostgreSQL 数组是否具有恒定的访问时间?(什么时候什么时候不?)
根据关于 ARRAY 构造函数的 PostgreSQL 文档:
默认情况下,数组元素类型是成员表达式的通用类型,使用与 UNION 或 CASE 构造相同的规则确定(参见第 10.5 节)。您可以通过将数组构造函数显式转换为所需类型来覆盖它,例如:
SELECT ARRAY[1,2,22.7]::integer[];
array
----------
{1,2,23}
(1 row)
这适用于将元素转换为整数和简单类型:
SELECT ARRAY[ 'name', 1]::text[];
array
----------
{name,1}
(1 row)
但转换似乎不适用于复杂元素,例如数组元素:
SELECT ARRAY[ 'name', 1, ARRAY['world']]::text[];
ERROR: malformed array literal: "name"
LINE 1: SELECT ARRAY[ 'name', 1, ARRAY['world']]::text[];
^
DETAIL: Array value must start with "{" or dimension information.
我的问题是:
有没有办法让自动转换工作text[]
?
(即无需编写即可进行上述转换SELECT ARRAY[ 'name'::text, 1::text, ARRAY['world']::text];
)
在下表中:
CREATE TABLE user (
email varchar[],
...
);
我想确保没有两个用户拥有相同的电子邮件。我不确定UNIQUE
约束如何与数组数据类型交互。确保唯一性的适当方法是什么?或者这是一种反模式,我应该只声明另一个emails
表吗?
我在 jsonb col 中有一些数据需要清理并插入到另一个文本数组列中。
我有的:
[
{
"v": "birthday"
},
{
"v": "reference"
}
]
我想要什么(_text):
{birthday, reference}
我的查询:
select array[col -> 0 ->> 'v', col-> 1 ->> 'v'] from src
给出了如上的预期结果。
但是,当值为 null 时,我希望不插入该值,即没有 NULL 值也不为空:
[
{
"v": "birthday"
}
]
应该导致
{birthday}
并不是
{birthday, [NULL]} -- NULL value
{birthday,} -- Empty string with coalesce
在创建数组时,如何根据元素的值有条件地将元素插入到数组中?
我试图建立一个正确的字符串作为参数传递给一个简单的查询。
返回记录的正确查询:
SELECT id_s FROM group_of_id_s
WHERE date IN ('2020-08-01','2020-08-01','2020-08-02','2020-08-03','2020-08-04');
...但如果我通过这个 (''2020-08-01','2020-08-01','2020-08-02','2020-08-03','2020-08-04'' ) 作为参数它不起作用。
我也试图通过这个('2020-08-01,2020-08-01,2020-08-02,2020-08-03,2020-08-04')
...但它也不起作用。
我的想法是通过一个过程把这个字符串作为参数。或许是这样的:
IN parameter TEXT
BEGIN
SET @c = CONCAT('SELECT id_s FROM group_of_id_s
WHERE date IN (', '''' , parameter, '''', ')');
PREPARE stmt from @c;
EXECUTE stmt;
END
任何参考或有用的建议将不胜感激。
编辑:基于来自@nbk 的非常有用的示例并在将其与数组进行比较之前更改日期格式,我设法提出了一个有效的查询,就像一个魅力。您可以在下面看到它的所有荣耀。;O) 来自@nbk 的响应因此被视为解决方案。非常感谢@nbk。
SELECT id_s FROM group_of_id_s
WHERE find_in_set(DATE_FORMAT(`date`, '%Y-%m-%d'), parameter) > 0;
粗表结构:
id uuid
fields jsonb
created_at timestamptz
related_content_ids _uuid
updated_at timestamptz
我正在尝试编写一个查询,该查询将查找此表中的所有记录,这些记录至少具有related_content_ids
列中指定数组的一个值。
像这样的东西适用于匹配数组中的所有值,但我只需要至少一个来匹配:
SELECT * FROM content WHERE related_content_ids @> '{fbaa1235-1069-496f-9a54-e91e13aadae8,65a109eb-ee4b-4a23-9f91-6980b5bb9340}'
我有一个看起来像下面这样的集合(我已经简化了很多)。我需要查询没有与customersInvited 相同数量的customersAccepted 条目的任何记录。
/* 1 */
{
"_id" : ObjectId("5d7b8ab0f1e55a2e4b6ccfa2"),
"title" : "Service AT19",
"customersInvited" : [
429409,
429410,
900
],
"customersAccepted" : [
429409,
429410,
900
],
"groupId" : null,
"deleted" : true,
"deletedDate" : ISODate("2019-10-12T05:59:08.135Z"),
}
$size 运算符可以做到这一点吗?在寻找固定数字时我很熟悉它,所以我的计划 B 将添加两个单独的字段,分别称为 numAccepted 和 numInvited,然后在修改记录时更新它并执行以下操作:
db.collection.find( { "numInvited": { $ne: "numAccepted" } } );
如果可以直接比较数组大小,我真的宁愿不维护我不需要的其他字段。您对此提供的任何建议将不胜感激。
我是 powershell 和 dbatools 的新手。这是一个很棒的工具,但是当我尝试将几个不同命令的结果组合成一个要导出到 csv 的数组时,它并没有提供预期的结果。它只打印第一个命令的输出。有人可以帮我加入所有三个变量的结果吗?我要做的是编写一个脚本来自动生成我们的 SQL Server 库存和容量评估报告。
到目前为止,这是我的代码:
$Servers = Get-Content 'C:\Users\temp\ServerList.txt'
$reportData = @()
foreach ($Server in $Servers) {
if (Test-Connection -ComputerName $Server -Count 1 -ErrorAction 'SilentlyContinue') {
$OSInfo=Get-DbaOperatingSystem -ComputerName MyServer| Select ComputerName, OSVersion, Version, Architecture
$DiskSPace=Get-DbaDiskSpace -ComputerName MyServer| Select ComputerName, Label, Name, Capacity, Free
$SQLInstanceInfo=Connect-DbaInstance -SqlInstance MyServer | Select DbaInstanceName, Edition, NetPort, IsClustered, Processors, ProductLevel, ServiceName,
$reportData +=$OSInfo
$reportData +=$DiskSPace
$reportData +=$SQLInstanceInfo
}
else {
write-host $Server "not connected"
}
}
Write-Output $reportData | Format-Table