【问题标题】:How to use column default in the where clause to identify default value如何在 where 子句中使用列默认值来识别默认值
【发布时间】:2014-06-02 17:17:54
【问题描述】:

我正在尝试编写一个查询来判断表a.t 中名为s 的列是否具有其默认值(这是一个非常大的base64 字符串)。所以我尝试了:

SELECT 1 FROM a.t WHERE s = (
   SELECT column_default FROM information_schema.columns
   WHERE (table_schema, table_name, column_name) = ('a', 't', 's'))
   AND uname = 'joe';

这不起作用,所以我注意到information_schema.columns 的结果中有一些常规查询没有的内容:

SELECT column_default FROM information_schema.columns
WHERE (table_schema, table_name, column_name) = ('a', 't', 's');

column_default | 'data:image/png;base64,iVBO...QmCC'::text

对比

SELECT s FROM a.t WHERE uname = 'joe';

s | data:image/png;base64,iVBO...QmCC

请注意缺少引号和显式转换。
这就是不匹配的原因吗?列s 定义为类型text
如何更改查询,以便测试列值与其默认值是否相等?

【问题讨论】:

  • 对不起,我认为这并不重要,但它是 9.3
  • 只要您不知道所有可能的解决方案,任何或所有解决方案都可能取决于使用的版本。例如,format() 是在 9.1 版本中引入的 ...

标签: sql postgresql dynamic-sql postgresql-9.3 column-defaults


【解决方案1】:

您从信息架构(或我的解决方案中的系统目录)中检索到的只是表示表达式的字符串文字。您需要真正执行它以获得价值。它可以是像您的情况一样的微不足道的演员表,也可以是 any 其他表达式。这就是您需要动态 SQL 的地方。 (或者从第一个查询的结果在您的客户端中连接第二个查询。)

此相关答案中的详细说明:
Generate DEFAULT values in a CTE UPSERT using PostgreSQL 9.3
(您还可以找到替代路线的说明没有动态 SQL那边。)

这个DO statement 可以解决问题。

DO
$do$
DECLARE
   _data text := 'data:image/png;base64,iVBO...QmCC';
   _answer bool;
BEGIN

EXECUTE (
   SELECT format('SELECT %s = $1', d.adsrc)
   FROM   pg_attribute a 
   JOIN   pg_attrdef   d ON (d.adrelid, d.adnum) = (a.attrelid, a.attnum)
   WHERE  a.attrelid = 'a.t'::regclass   -- schema.table
   AND    a.attname = 's'
   )
USING  _data
INTO   _answer;

RAISE NOTICE '%', answer;

END
$do$;

为了重复使用,我会将它包装到一个 plpgsql 函数中。有很多相关的答案。

另外请注意,列默认值可能会产生副作用,例如增加序列。不是在这种特殊情况下,但通常我建议在执行之前检查默认的

【讨论】:

  • 感谢您的解释 - 我不需要通用解决方案,但现在我明白发生了什么,所以我意识到我可以从信息架构中选择 left(right(column_default, -1), -7) 并让它工作。
  • @user9645:您可能还对我在the other answer I linked to 中应用的没有动态 SQL 的替代路线感兴趣。基本上:创建表的临时副本并插入一个虚拟行(实现默认值)。
猜你喜欢
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 2020-09-24
  • 2019-01-16
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多