Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何在plpgsql中引用架构变量_Postgresql_Plpgsql - Fatal编程技术网

Postgresql 如何在plpgsql中引用架构变量

Postgresql 如何在plpgsql中引用架构变量,postgresql,plpgsql,Postgresql,Plpgsql,我正在尝试学习plpgsql代码来自动清理数据库中的一些数据 我当前的任务是将数字字段中的所有“999”值替换为“NaN”。我想做的是: 1) 查找架构中所有数字列 2) 循环浏览这些内容并使用“更新/替换” 我的代码如下。我认为我的主要问题是找出如何在update语句中引用schema.table(但我确信还有一些事情我做得不太好) 我得到的错误是无法识别这种关系。 如有任何协助,将不胜感激 贝基 尝试按以下方式重新处理查询: EXECUTE 'update '|| (schemanm||'.

我正在尝试学习plpgsql代码来自动清理数据库中的一些数据

我当前的任务是将数字字段中的所有“999”值替换为“NaN”。我想做的是: 1) 查找架构中所有数字列 2) 循环浏览这些内容并使用“更新/替换”

我的代码如下。我认为我的主要问题是找出如何在update语句中引用schema.table(但我确信还有一些事情我做得不太好)

我得到的错误是无法识别这种关系。 如有任何协助,将不胜感激

贝基


尝试按以下方式重新处理查询:

EXECUTE 'update '|| (schemanm||'.'||tname)::regclass ||' set ' || quote_ident(cname) ||' = ''NaN'' WHERE '|| quote_ident(cname) ||' = 999;'
因为强制转换到
regclass
正在尝试在注册关系中搜索。图式不是关系

或者你可以

EXECUTE 'update '|| quote_ident(schemanm)||'.'||quote_ident(tname) ||' set ' || quote_ident(cname) ||' = ''NaN'' WHERE '|| quote_ident(cname) ||' = 999;'

尝试按以下方式重新处理查询:

EXECUTE 'update '|| (schemanm||'.'||tname)::regclass ||' set ' || quote_ident(cname) ||' = ''NaN'' WHERE '|| quote_ident(cname) ||' = 999;'
因为强制转换到
regclass
正在尝试在注册关系中搜索。图式不是关系

或者你可以

EXECUTE 'update '|| quote_ident(schemanm)||'.'||quote_ident(tname) ||' set ' || quote_ident(cname) ||' = ''NaN'' WHERE '|| quote_ident(cname) ||' = 999;'

对此,我宁愿使用
format()
。占位符
%I
负责在需要时正确引用标识符

replace()
用于字符串操作,而不是替换数字。要指定值NaN,请使用
set xxx='NaN'
,但不能对
整数值执行此操作。整数不支持
NaN

因此,您的动态SQL可以归结为:

execute format('update %I.%I set %I = ''NaN'' where %I = 999, schemanm, tname, cname, cname);
但是您需要将where子句更改为不包含
integer
列。您可能还希望包括
数值
实数

and data_type in ('numeric','double precision', 'real')

如果您只想标记“缺少信息”,我宁愿在这些列中存储
null
。在这种情况下,不需要区分不同的数据类型:

execute format('update %I.%I set %I = null where %I = 999, schemanm, tname, cname, cname);

对此,我宁愿使用
format()
。占位符
%I
负责在需要时正确引用标识符

replace()
用于字符串操作,而不是替换数字。要指定值NaN,请使用
set xxx='NaN'
,但不能对
整数值执行此操作。整数不支持
NaN

因此,您的动态SQL可以归结为:

execute format('update %I.%I set %I = ''NaN'' where %I = 999, schemanm, tname, cname, cname);
但是您需要将where子句更改为不包含
integer
列。您可能还希望包括
数值
实数

and data_type in ('numeric','double precision', 'real')

如果您只想标记“缺少信息”,我宁愿在这些列中存储
null
。在这种情况下,不需要区分不同的数据类型:

execute format('update %I.%I set %I = null where %I = 999, schemanm, tname, cname, cname);

谢谢你,伊利亚-这解决了schema.table引用问题。非常感谢。现在返回一个错误,说明列999不存在,因此现在是另一个引用问题…即使错误消息正确引用了查询:update schema.table set column=replace(column,“999”,“NaN”);已更新原始响应。我没有注意到您正在处理非字符串列。因此,查询应该类似于
updateschema.table SET column='NaN',其中column=999执行'update'| | |'(schemanm | | |'。| | tname)::regclass | | |'set'| | quote | ident(cname)| |'='NaN'其中'| | | quote | ident(cname)| |'=999。。。。。I get:整数“NaN”的输入语法无效。如何将不同的字符串/数字/列/表组合在一起显然是我必须要做的事情!谢谢你,伊利亚-这解决了schema.table引用问题。非常感谢。现在返回一个错误,说明列999不存在,因此现在是另一个引用问题…即使错误消息正确引用了查询:update schema.table set column=replace(column,“999”,“NaN”);已更新原始响应。我没有注意到您正在处理非字符串列。因此,查询应该类似于
updateschema.table SET column='NaN',其中column=999执行'update'| | |'(schemanm | | |'。| | tname)::regclass | | |'set'| | quote | ident(cname)| |'='NaN'其中'| | | quote | ident(cname)| |'=999。。。。。I get:整数“NaN”的输入语法无效。如何将不同的字符串/数字/列/表组合在一起显然是我必须要做的事情!太好了,谢谢你。我没有意识到关于整数…所以需要将整数改为双倍(或数字?),因为我们想用“NaN”来表示在整数和其他数字字段中出现的问卷调查中的“我不知道”答案。再次感谢你。极大地appreciated@user3770062为什么不改用
NULL
?这是存储“缺少”值的“SQL方式”,因为我们需要一个“不适用”值和一个“我不知道”值。数据库中存在的空字段已经存在,因为该特定问题不适用……这些字段,受访者回答“我不知道;太好了,谢谢你。我没有意识到关于整数…所以需要将整数改为双倍(或数字?),因为我们想用“NaN”来表示在整数和其他数字字段中出现的问卷调查中的“我不知道”答案。再次感谢你。极大地appreciated@user3770062为什么不改用
NULL
?这是存储“缺少”值的“SQL方式”,因为我们需要一个“不适用”值和一个“我不知道”值。数据库中存在的空字段已经存在,因为该特定问题不适用……这些字段,受访者回答“我不知道;