Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mSj6f-0004a0-Ay for pgsql-novice@arkaria.postgresql.org; Tue, 21 Sep 2021 16:58:57 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1mSj6e-00037D-5d for pgsql-novice@arkaria.postgresql.org; Tue, 21 Sep 2021 16:58:56 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mSg3T-00062V-OW for pgsql-novice@lists.postgresql.org; Tue, 21 Sep 2021 13:43:27 +0000 Received: from mail-qt1-x82c.google.com ([2607:f8b0:4864:20::82c]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1mSg3R-0005LW-BM for pgsql-novice@lists.postgresql.org; Tue, 21 Sep 2021 13:43:27 +0000 Received: by mail-qt1-x82c.google.com with SMTP id d8so6546791qtd.5 for ; Tue, 21 Sep 2021 06:43:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:content-transfer-encoding:mime-version:subject:message-id:date :to; bh=EhjuVPae15u3lIXqqIhXF2/YgM5VitAOkNFZ88THWxw=; b=QYrAxEChUYT7XwiqDPAE2iyR78AMnajbjXKWLxWVSQKTSvkk+WaXdidcq6cHoHLuGA qlXtwDU4evbfaubmuCliqPf4Y2b7PCU8AlZK1IIkFw7M0D2cJbQWmqJuSHj1Zw2T+MpJ G0o+wChzCKdQhr6f2cG1t4aRur2RSbEr6ytCEuAFqnSQ467zrOatorHAuhqzYN8kBkYq 32uSksv7sHJvGoh26IjXR8wxCGC/CS1Oy872LgYN68FlJyT4C3g+miiuIEWj0GaInA3d Z6/HHKf6F/tNg0p97pPsd++EZnIj4yPqd69ElA+3VOpjIdXAot4deBUkWyXnDGtFjfCQ 951Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:content-transfer-encoding:mime-version :subject:message-id:date:to; bh=EhjuVPae15u3lIXqqIhXF2/YgM5VitAOkNFZ88THWxw=; b=6Xpkvck/D1vDesmmpztkj0uZCz7+IVVqnl9DvyNdJEEPt6vL2PpkTJC1MBNUEtvQJ7 9frIY0y5UTzpmuaQjUgsk407vuziK7N+UG7du6b0LDyhd+lI1I1T3GGNpq+fm5OMI8P7 cP/Zs1UsZqmqsaffq9so8AbZXsCY78v/hsvFpXu2KVLoWqZP0HVLrq5cPoHc5TiBEPLI J9/bpz2TVuS04WGYTRxVDhD9khe94h0ys4aWGcw2ulbqbP6LXL6/3l2tlOVwbVr4ugNj fk9PYNPt2YdYW0dmmvoIgyBoGFhwxTy11pn9x8PjNoVbvWupySdepk8AuePWaJ0uYZpb pA8Q== X-Gm-Message-State: AOAM532OOvOoF5GhOaw7PjikodiPgCEFhdyDNHxupQOxZYvzOSdzZFf8 eu1xb0b92IZ2RCBalz03io7RBRr2mKM= X-Google-Smtp-Source: ABdhPJzXTtDCg6xWJ4HxEw6XKV7yNcRStxA9uj7TJl0vgm9mpVK24N2jm6TknYpa72HekIwjMoHNPQ== X-Received: by 2002:ac8:7765:: with SMTP id h5mr6546641qtu.328.1632231802904; Tue, 21 Sep 2021 06:43:22 -0700 (PDT) Received: from smtpclient.apple ([135.12.136.225]) by smtp.gmail.com with ESMTPSA id c30sm4334409qtg.50.2021.09.21.06.43.22 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 21 Sep 2021 06:43:22 -0700 (PDT) From: Utku Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Mime-Version: 1.0 (Mac OS X Mail 14.0 \(3654.120.0.1.13\)) Subject: How to UPSERT with optional updates? Message-Id: Date: Tue, 21 Sep 2021 09:43:21 -0400 To: pgsql-novice@lists.postgresql.org X-Mailer: Apple Mail (2.3654.120.0.1.13) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk I'm trying to write a script for an optional upsert. That is, it is just = like a regular insert or update, but in addition, the information of a = given column should be updated, or be left as-is, is passed as well. = That is: - Insert if does not exist. - If exists, check the parameters to understand if a particular column = should be updated, or be left as-is. This is the script that I have so far: INSERT INTO table_name ( "col1", "col2", "col3", "col4", "col5", "col6", "col7" ) SELECT DISTINCT a."col1", a."col2", a."col3", a."col4", a."col5", a."col6", a."col7" FROM UNNEST ( $1::uuid[], $2::uuid[], $3::numeric[], $4::numeric[], $5::boolean[], $6::boolean[], $7::timestamptz[], $8::boolean[], $9::boolean[], $10::boolean[] ) WITH ORDINALITY AS a( "col1", "col2", "col3", "col4", "col5", "col6", "col7", "shouldUpdateCol3", "shouldUpdateCol4", "shouldUpdateCol5", "ordinality" ) ON CONFLICT ("col1", "col2") DO UPDATE SET "col3" =3D CASE WHEN EXCLUDED."shouldUpdateCol3" =3D TRUE THEN = EXCLUDED."col3" ELSE table_name."col3" END, "col4" =3D CASE WHEN EXCLUDED."shouldUpdateCol4" =3D TRUE THEN = EXCLUDED."col4" ELSE table_name."col4" END, "col5" =3D CASE WHEN EXCLUDED."shouldUpdateCol5" =3D TRUE THEN = EXCLUDED."col5" ELSE table_name."col5" END, "col7" =3D EXCLUDED."col7"; It does not work, because the columns `shouldUpdateCol3`, = `shouldUpdateCol4` and `shouldUpdateCol5` are not selected in the = `SELECT FROM UNNEST` above. However, if I add them to the `SELECT FROM UNNEST`, then I get `INSERT = has more expressions than target columns` error.=