【问题标题】:Returning alternative value if null?如果为空,则返回替代值?
【发布时间】:2020-07-17 20:04:09
【问题描述】:

您好,我正在使用 postgres 12。我已经学习了几天了。

我想知道是否可以写入 CREATE TABLE 阶段:IF column_x is NULL, return 'alternative value'?

这是我当前的表:

CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
      NEW.modified = NOW(); 
      RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TABLE example (
    id BIGSERIAL NOT NULL PRIMARY KEY,
    entry_name VARCHAR(150) NOT NULL UNIQUE,
    about VARCHAR(1500),
    org_type VARCHAR(150),
    category VARCHAR(150),
    sub_categories VARCHAR(300),
    website_link VARCHAR(300) UNIQUE,
    membership VARCHAR(100),
    instagram VARCHAR(150) UNIQUE,
    twitter VARCHAR(150) UNIQUE,
    link_lists VARCHAR(100) UNIQUE,
    facebook VARCHAR(200) UNIQUE,
    youtube VARCHAR(200) UNIQUE,
    podcast VARCHAR(200) UNIQUE,
    tags VARCHAR(150),
    created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    modified TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE TRIGGER set_timestamp BEFORE UPDATE ON bbdb FOR EACH ROW EXECUTE PROCEDURE update_modified_column();

因此,在这种情况下,我希望“about”和“website_link”中的任何空条目都说“即将推出”,而所有社交媒体空条目都只说“无”。我想我的 UNIQUE 约束不允许这样做? (我让他们避免条目重复,以防“entry_name”随变体提交)。

感谢您的帮助。

【问题讨论】:

  • 您可以在检索数据时进行合并。

标签: postgresql nullif


【解决方案1】:

当您将所有这些列定义为 UNIQUE 时,您可以有多个 null 值,但不能有两行具有相同的 'Coming soon' 值。

但您可以在检索期间将这些 NULL 值替换为所需的替换:

select id, 
       coalesce(website_link, 'Coming Soon') as website_link,
       coalesce(about, 'Coming soon') as about,
       coalesce(twitter, 'None') as twitter,
       coalesce(instgram, 'None') as instagram
from the_table;

如果您不想每次都输入,请创建一个视图来为您执行此操作。

【讨论】:

  • 非常感谢。抱歉,我只需要澄清“唯一约束不会更改任何数据”部分。你是说即使我对这些字段有唯一的限制,这个触发器也会取代那个,并且“即将推出”和“无”的非唯一条目将被允许?
  • @Lebene:我的意思是唯一约束不会神奇地将null 变成'Coming soon' - 但我确实忽略了几乎所有列都定义为unique(这很友好奇怪的)
  • 好吧,没关系,我从来没有这样的假设。我希望社交媒体链接是独一无二的,因为不幸的是,“entry_name”提交的内容不断被错误、拼写错误或变体提交。因此,例如'McDonalds'、'MacDonalds'、McDonald's 等。它们都是相同的,但由于某种原因,几乎所有 SM 链接都有唯一的条目,然后只有一个会有重复项。我不知道如何克服这一点。如果有重复条目,也许我真正需要的是一个动作?
  • 感谢您的解决方案。我尝试了没有唯一约束的触发器,但它对我不起作用,但我会继续尝试!
  • 唯一约束不会检测到 McDonalds、MacDonalds、'McDonald's 是否相同。虽然一个人很可能将每个人重新殖民为计算机不会的同一事物的变体,至少在您没有大量工作的情况下。计算机是相当字面的,所以 MacDonalds 包含一个“a”作为第二个字母,其他没有,McDonald's 包含一个撇号,其他没有;所以他们都通过了独特的标准。似乎你有 3 个选择:编写大量代码(或找到一个库),创建一个查找表(但这将是一个巨大的维护问题),别担心。
猜你喜欢
  • 2020-08-09
  • 2014-02-07
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 2021-11-30
  • 1970-01-01
相关资源
最近更新 更多