Выгрузка соответствующих полей на основе параметра функции JSON - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть следующая таблица, названная operator, определенная ниже в базе данных v10.Я хочу добавить в эту таблицу на основе функции со следующей подписью.Аргумент JSONB может иметь или не иметь какие-либо поля в таблице.(Обратите внимание, что username или primary_email не являются нулевыми и являются альтернативными ключами, поэтому всегда будут (должны) присутствовать в объекте JSON, и я использую его для любого более обычного upsert типа ON CONFLICT ON CONSTRAINT operator_primaryemail_uidx.) Каковы мои варианты дляделать это?

CREATE OR REPLACE FUNCTION upsert_operator(_data JSONB DEFAULT NULL)

Example JSON: {
  "username": "potato",
  "last_name": "doe",
  "street": "123 Main St."
}

CREATE TABLE IF NOT EXISTS operator (
  id                  UUID DEFAULT uuid_generate_v1mc(),

  party_id            UUID,

  username            VARCHAR(32) NOT NULL,
  profile_picture_uri VARCHAR(512),
  first_name          VARCHAR(64),
  last_name           VARCHAR(64),
  street              VARCHAR(128),
  specifier           VARCHAR(128),
  city                VARCHAR(64),
  state               VARCHAR(2),
  zipcode             VARCHAR(9),
  primary_email       CITEXT NOT NULL,
  primary_phone       VARCHAR(10),
  secondary_email     CITEXT,
  secondary_phone     VARCHAR(10),
  is_locked           BOOLEAN NOT NULL DEFAULT false,
  must_reset_pwd      BOOLEAN NOT NULL DEFAULT false,
  retry_count         SMALLINT DEFAULT 0,
  signed_eula         BOOLEAN NOT NULL DEFAULT false,
  last_login          TIMESTAMP WITH TIME ZONE,

  created             TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT statement_timestamp(),
  updated             TIMESTAMP WITH TIME ZONE DEFAULT 'infinity',
  deleted             TIMESTAMP WITH TIME ZONE DEFAULT 'infinity',

  -- keys
  CONSTRAINT operator_pk PRIMARY KEY (id),
  CONSTRAINT operator_party_fk FOREIGN KEY (party_id)
      REFERENCES party(id) MATCH SIMPLE
      ON UPDATE RESTRICT ON DELETE RESTRICT,

  -- checks
  CONSTRAINT operator_username_ak UNIQUE(username),
  CONSTRAINT operator_primaryemail_uidx UNIQUE(primary_email),
  CONSTRAINT operator_updated_gt_created CHECK (updated >= created),
  CONSTRAINT operator_deleted_gt_created CHECK (deleted >= created)
)
...