在 PostgreSQL 中的触发器过程上指定CALLED ON NULL INPUT, RETURNS NULL ON NULL INPUTor STRICT( https://www.postgresql.org/docs/current/static/sql-createfunction.html ) 会起到什么作用吗?
由于触发器过程必须声明为不带参数的函数(https://www.postgresql.org/docs/current/static/plpgsql-trigger.html),我怀疑它有任何效果,但我找不到明确的答案关于这一点。
这很快(49ms):
v_cpf_numerico := ext.uf_converte_numerico(new.nr_cpf);
select cd_cliente into v_cd_cliente
from central.cliente where nr_cpf_cnpj = v_cpf_numerico;
Run Code Online (Sandbox Code Playgroud)
这很慢(15 秒):
select cd_cliente into v_cd_cliente
from central.cliente where nr_cpf_cnpj = ext.uf_converte_numerico(new.nr_cpf);
Run Code Online (Sandbox Code Playgroud)
功能:
create or replace function ext.uf_converte_numerico(_input varchar(30)) returns bigint
as
$$
begin
_input := regexp_replace(_input, '[^0-9]+', '', 'g');
if _input = '' then
return null;
end if;
return cast(_input as bigint);
end
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
我使用的是 PostgreSQL 12。
为什么第二个变体很慢?
postgresql performance functions postgresql-12 query-performance
每个人,
我无法弄清楚以下用户定义函数中缺少什么:
CREATE OR ALTER FUNCTION ufn_GetSalaryLevel(@Salary money)
RETURNS VARCHAR(10)
AS
BEGIN
IF (@Salary < 30000) RETURN 'Low';
ELSE IF (@Salary <= 50000) RETURN 'Average';
ELSE RETURN 'High';
RETURN '';
END;
SELECT dbo.ufn_GetSalaryLevel(100440)
Run Code Online (Sandbox Code Playgroud)
输出仅包括“低”/“平均”/“高”返回值的第一个字符:
-----------------------------------------------------------------------
H
(1 row affected)
Run Code Online (Sandbox Code Playgroud)
为什么 MS SQL Server Management Studio 不考虑 VARCHAR(10)?
提前致谢!
Ps 请在下面找到我的输出 - 我不明白为什么它不能按预期工作?
ps2:该函数只有一个参数,我好像没有找到另一个同名的函数……下面可以找到与该函数相关的代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
CREATE FUNCTION …Run Code Online (Sandbox Code Playgroud) 我需要拆分一个逗号分隔的字符串,对其进行操作,然后将其连接回一个保留数据原始顺序的字符串(如果可能)。
例如,采用CREATE TABLE像这样的语句(作为字符串)的列定义列表'BrentOzarColumn INTEGER, PaulWhiteColumn DATETIME, ErikDarlingColumn VARCHAR(100)'。我想逗号分隔列表被划分到结果集,如使用SQL Server内置的功能STRING_SPLIT(),像这样:SELECT TRIM([Value]) AS CoolDataPeople FROM STRING_SPLIT('BrentOzarColumn INTEGER, PaulWhiteColumn DATETIME, ErikDarlingColumn VARCHAR(100)', ',')。
在不指定ORDER BY子句的情况下,这会重复产生(巧合?)以下结果,这些结果似乎按与字符串中相同的顺序排序:
一旦我得到了上面的结果集,我想对每一行应用一些额外的字符串操作(例如附加一些常量文本),然后将每一行连接回一个类似于STRING_AGG()(再见STUFF ... FOR XML PATH:)的函数,顺序与原始字符串。所以我的最终结果的一个例子可能是'BrentOzarColumn INTEGER SQLROX, PaulWhiteColumn DATETIME SQLROX, ErikDarlingColumn VARCHAR(100) SQLROX'.
最终我的问题是:函数的结果是否STRING_SPLIT()以确定性顺序返回?我知道没有ORDER BY子句,从 a Tableor等数据集中选择时不能保证排序View,但想知道函数是否有区别?
当我输入这个时,我有一种预感,答案是否定的,排序不是确定性的,因此我不能保证结果的顺序。此外,我打赌可能会为我在结果之上运行的每个函数添加额外的不确定性,尤其是当我将它们与STRING_AGG(). (不管答案如何,我感谢您的帮助,你们都是很酷的数据人员。;)
如何从 Postgres 中的 json(b) 对象中提取/获取/选择“子对象”?
似乎有很多信息几乎可以让我到达那里,但又不完全是。很多关于转换为记录、过滤然后从中构建新对象的内容。说实话,我真的很惊讶这不是内置功能。也许有一种简单的方法可以通过组合内置 fns 来实现此目的?我正在寻找的本质上相当于select-keys;一个函数(比如jsonb_select_keys)给出了这个:
SELECT jsonb_select_keys('{"a":42,"b":43,"c":44,"d":97}', '{a,d,e}');
Run Code Online (Sandbox Code Playgroud)
会返回这个:
{"a":42,"d":97}
Run Code Online (Sandbox Code Playgroud)
有点像jsonb_path_query_array,但针对的是 kv 对而不是值。
服务器 A 和服务器 B 具有相同的硬件和实例配置(A 是生产,B 是 QA)。B 的数据库是从一周前 A 的备份中恢复的。开发团队向我提供了这个查询。
SELECT
c.Start
,c.[End]
,c.Word
,doc.UniqueDocumentNumber
,doc.EID
,c.CUI
,c.Concept
,a.OID
,doc.DocumentTypeName
,doc.ActivityDtTm
,CAST(doc.DocumentTypeId AS INT) AS MedCode
,CASE WHEN c.[Count] = 0 THEN CAST(0.00 AS REAL)
ELSE CAST(LOG(c.TotalCount / c.[Count]) AS REAL) END AS 'idf'
,c.[Count]
,c.TotalCount
FROM ECHO..AEID201 a
INNER JOIN ALPHA..XADocuments doc (NOLOCK) ON a.EID = doc.EID
CROSS APPLY (SELECT t.start,t.[end],t.word,t.cui,t.eid,
t.UniqueDocumentNumber,cu.[Count],cc.TotalCount,core.Concept
FROM HOTEL.dbo.Htf_Index AS t
INNER JOIN HOTEL..Doc_CUI_Counter AS cu ON cu.CUI=t.CUI AND cu.DocumentTypeID=t.DocumentTypeID
INNER JOIN HOTEL..Doc_Counter …Run Code Online (Sandbox Code Playgroud) execution-plan sql-server-2008-r2 subquery functions cross-apply
我想编写一个 PostgreSQL 存储函数,它的行为本质上类似于我从 MSSQL 和 MySQL 中了解和喜爱的存储过程,我可以在其中包装一个不带参数的查询并让它返回该结果集,而无需指定输出的格式并在每次更新查询时更改该定义。这在 PostgreSQL 中甚至可能吗?
我使用 PostgreSQL 9.2 尝试了以下操作:
CREATE OR REPLACE FUNCTION test()
RETURNS SETOF record
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误:
错误:返回“记录”的函数需要列定义列表
我也试过:
CREATE OR REPLACE FUNCTION test()
RETURNS table ()
Run Code Online (Sandbox Code Playgroud)
但显然这是无效的语法。
这适用于 SQL Server 2012。
我们有一些 FTP 文件的导入过程,这些过程被拾取并读入临时表,从那里我们在进入生产之前按摩/检查数据。导致一些问题的领域之一是日期,有些是有效的,有些是错别字,有些只是简单的胡言乱语。
我有以下示例表:
Create Table RawData
(
InsertID int not null,
MangledDateTime1 varchar(10) null,
MangledDateTime2 varchar(10) null,
MangledDateTime3 varchar(10) null
)
Run Code Online (Sandbox Code Playgroud)
我也有一个目标表(比如在生产中)
Create Table FinalData
(
PrimaryKeyID int not null, -- PK constraint here, ident
ForeighKeyID int not null, -- points to InsertID of RawData
ValidDateTime1 SmallDateTime null,
ValidDateTime2 SmallDateTime null,
ValidDateTime3 SmallDateTime null
)
Run Code Online (Sandbox Code Playgroud)
我将以下内容插入到 RawData 表中:
Insert Into RawData(InsertID, MangledDateTime1, MangledDateTime2, MangledDateTime3)
Values(1, '20001010', '20800630', '00000000') -- First is legit, second two are …Run Code Online (Sandbox Code Playgroud) 目前我创建了一个视图,请在答案中查看。如何根据该crosstab()查询创建函数,以便传递日期并获取特定日期的数据?
多次调用该函数并传递不同的日期来填充图表(例如)也是一种好习惯吗?
我正在编写一个表值函数,调用该函数所需的时间是直接运行代码的 10 倍。我将此追溯到对 TVF 内的多行标量函数的调用。从 TVF 内部调用时,对标量函数的调用过慢。标量函数接受 3 个 int 参数并返回单个 int 结果。
什么会导致它在 TVF 中变慢?
首先,TVF 基本上是一种数据透视表,只返回一行,有 13 列。
标量函数是一个多行标量,它在两个表中的一个中查找一组匹配的键(即输入是 columnA,输出是 columnB,其中 input = columnA 和 active)。使用稍微更改的 where 子句再次搜索表 1,然后是表 2,最后是表 1。
用法最初是一个带有连接子句的 cte 查询:
With cte as ( select count(*) over (partition by c.c1) recs,
c.setId, c.c1, c.c2, n.name
From tbl c
Inner join tbl n on n.id = schma.scal(c.c1, c.c2, c.c3)
Where c.setId=@setId and c.endDt is null
)
Run Code Online (Sandbox Code Playgroud)
这个 cte 最初被调用了 11 次,从(大约一半的时间)返回到 3 行(使用像 c1=42 这样的 …
functions ×10
postgresql ×5
sql-server ×4
performance ×3
cross-apply ×1
datatypes ×1
determinism ×1
json ×1
order-by ×1
plpgsql ×1
subquery ×1
t-sql ×1
trigger ×1
view ×1