我有一个联系人(ID、名字、姓氏、中间名)。
例如:
| ID | FirstName | LastName | MiddleName |
|====|===========|==========|============|
| 1 | Mark |Jordan | E |
|----|-----------|----------|------------|
| 2 | James | Blunt | NULL |
|----|-----------|----------|------------|
Run Code Online (Sandbox Code Playgroud)
我要输出
Mark E. Jordan
James Blunt
Run Code Online (Sandbox Code Playgroud)
因此,如果 MiddleName 不为空,则添加一个 '.' 之后,否则输出空值。
我知道isnull函数,但是我需要的是isnotnull函数。如何完成查询?
到目前为止我的查询:
select FirstName + ' ' + isnull(...) + LastName
from Contact
Run Code Online (Sandbox Code Playgroud) 我目前正在更新旧的标量值函数,希望能够提高它们的效率或将它们更改为内联 TVF。
在对我的重写进行故障排除时,我在原始代码中遇到了一些奇怪的问题,根据我对 SQL 中变量的理解,这似乎没有意义
如果我要写
Declare @var as Integer
Select @var = col1 from table
Run Code Online (Sandbox Code Playgroud)
然后这将始终返回 col1 中的最后一项。但是,在我正在使用的功能中,情况似乎并非如此。最初,有一个 where 子句根据输入更改结果,但是,删除它后,上述属性应该保持不变。在大多数情况下,确实如此,但也有一些情况并非如此。
大纲大致类似于以下内容:
create function f (
@var1 ... )
returns datatype
begin
Declare @temp1 ... (several vars declared here)
select @temp1 = col1, @temp2 = col2, ..., @tempX = max(colX) from(
select col1, col2, ... ,
colX * (case when name = 'X' then 1 else 0)
from table1
INNER JOIN table2 on ...
inner join table3 on ...
left …Run Code Online (Sandbox Code Playgroud) 我有这样的表:
table a (
id
--
p1 text,
p2 text,
p3 text
)
Run Code Online (Sandbox Code Playgroud)
当我编写一些使用该表的函数时,我需要编写这样的代码
create or replace function ...
select * from a
where a.p1 is not null
and a.p2 is not null
and a.p3 is not null
Run Code Online (Sandbox Code Playgroud)
我想创建一个函数,
create function my_function(??? val) returns boolean as -- what I need to place instead of ???
$$
begin
return val.p1 is not null
and val.p2 is not null
and val.p3 is not null;
end;
$$ language plpgsql
Run Code Online (Sandbox Code Playgroud)
其中我将传递当前行的“this”实例(我不知道它是如何调用的),我的函数将如下所示:
select * from …Run Code Online (Sandbox Code Playgroud) 我有这个生成随机字符串的语句:
SELECT string_agg (substr('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ceil (random() * 62)::integer, 1), '')
FROM generate_series(1, 20);
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何在函数内实现此功能,该函数会将上述语句的值自动分配给url_prefix创建新记录时命名的字段(on INSERT's)?
我有一个程序:
create or replace procedure pro_update_last_read(in input_sensor_id integer, in read_time timestamp)
as
$$
begin
update sensor
set last_read = read_time
where sensor_id = input_sensor_id;
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
以及一个调用它的触发器:
create trigger tri_last_read
after insert or update of report_time
on report
execute procedure pro_update_last_read(sensor_id, report_time);
Run Code Online (Sandbox Code Playgroud)
但是,在创建触发器时,我收到错误消息:
Run Code Online (Sandbox Code Playgroud)[42883] ERROR: function pro_update_last_read() does not exist
为什么会发生这个错误?
2 天前,我创建了一个需要INSERT和的函数,UPDATE我XP_CMDShell通过运行脚本启用并执行它。
之后,SQL Server 的SELECT命令运行速度非常慢。即使SELECT是INSERT通过分隔命令运行的非常简单的语句。
我在其他数据库上测试了这种行为,它SELECT在几分钟后运行得到相同的结果。
此外,我使用 SQL Server 2014 在其他 2 台主机上对其进行了测试,结果相同。
我创建的函数是为了在另一个 select 语句中获取它的值:
ALTER FUNCTION [Prg].[intCheckDelayedProcessProgram]
(
@SalesOrderProductID INT,
@MainProductTreeID INT,
@ProductTreeID INT,
@ProcessId INT,
@additionalDays INT = 2,
@currentDateReverceString VARCHAR(10) = NULL
)
RETURNS INT
AS
BEGIN
--declare @SalesOrderProductID INT = 40957,
-- @MainProductTreeID INT = 93758,
-- @ProductTreeID INT = 93758,
-- @ProcessId INT = 4472,
-- @additionalDays INT = 2, …Run Code Online (Sandbox Code Playgroud) 我将 Postgres 13.3 与内部和外部查询一起使用,它们都只产生一行(只是一些关于行数的统计数据)。
我不明白为什么下面的 Query2 比 Query1 慢得多。它们基本上应该几乎完全相同,最多可能只有几毫秒的差异......
WITH t1 AS (
SELECT
(SELECT COUNT(*) FROM racing.all_computable_xformula_bday_combos) AS all_count,
(SELECT COUNT(*) FROM racing.xday_todo_all) AS todo_count,
(SELECT COUNT(*) FROM racing.xday) AS xday_row_count
OFFSET 0 -- this is to prevent inlining
)
SELECT
t1.all_count,
t1.all_count-t1.todo_count AS done_count,
t1.todo_count,
t1.xday_row_count
FROM t1;
Run Code Online (Sandbox Code Playgroud)
我只添加了一行:
WITH t1 AS (
SELECT
(SELECT COUNT(*) FROM racing.all_computable_xformula_bday_combos) AS all_count,
(SELECT COUNT(*) FROM racing.xday_todo_all) AS todo_count,
(SELECT COUNT(*) …Run Code Online (Sandbox Code Playgroud) 我在网上读到,标量函数会影响性能,因为优化器无法访问标量函数的内容。由于该函数是针对每一行执行的,因此优化器是否必须每次都为函数的内容构建执行计划,或者是否在第一次访问该函数时构建该计划,然后将其用于所有其他行?
我对使用标量 UDF 的列有一个检查约束。我有一个需要对 UDF 进行更改的要求。根据我所知,我需要删除约束,对 UDF 进行更改,然后重新添加约束。在删除约束期间,我担心可能会向表中插入坏数据。有没有办法在不放弃约束的情况下更改 UDF?如果没有,有没有办法防止坏数据进入表中?
我有一个带有 REAL 类型列的简单表。
表中有 2 行,值分别为 0.23 和 0.24。如果我运行以下命令:
SELECT AVG(MyColumn) FROM dbo.MyTable
Run Code Online (Sandbox Code Playgroud)
我希望得到 0.235 的结果,但实际上我得到 0.2349999901234。
有人可以告诉我为什么吗?
functions ×10
postgresql ×4
sql-server ×4
optimization ×2
cte ×1
insert ×1
parallelism ×1
plpgsql ×1
random ×1
subquery ×1
t-sql ×1
trigger ×1
xp-cmdshell ×1