X-Original-To: pgsql-performance-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 1EC19528C1 for ; Tue, 28 Jun 2005 12:08:20 -0300 (ADT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 50917-03 for ; Tue, 28 Jun 2005 15:08:10 +0000 (GMT) Received: from sccmmhc92.asp.att.net (sccmmhc92.asp.att.net [204.127.203.212]) by svr1.postgresql.org (Postfix) with ESMTP id 2E2A852848 for ; Tue, 28 Jun 2005 12:08:09 -0300 (ADT) Received: from juju.arbash-meinel.com ([12.214.18.81]) by sccmmhc92.asp.att.net (sccmmhc92) with ESMTP id <20050628150804m92008i5hhe>; Tue, 28 Jun 2005 15:08:08 +0000 Received: by juju.arbash-meinel.com (Postfix, from userid 505) id 368D45606A; Tue, 28 Jun 2005 10:08:04 -0500 (CDT) Received: from [192.168.1.11] (mail [192.168.1.1]) by juju.arbash-meinel.com (Postfix) with ESMTP id 35D2055FCB; Tue, 28 Jun 2005 10:07:51 -0500 (CDT) Message-ID: <42C167C6.5070108@arbash-meinel.com> Date: Tue, 28 Jun 2005 10:07:50 -0500 From: John A Meinel User-Agent: Mozilla Thunderbird 1.0.2 (Windows/20050317) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Merlin Moncure Cc: pgsql-performance@postgresql.org Subject: Re: tricky query References: <6EE64EF3AB31D5448D0007DD34EEB3415C2BEC@Herge.rcsinc.local> In-Reply-To: <6EE64EF3AB31D5448D0007DD34EEB3415C2BEC@Herge.rcsinc.local> X-Enigmail-Version: 0.92.0.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig993DD4397E8462A824F32F2F" X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.054 tagged_above=0 required=5 tests=AWL, FORGED_RCVD_HELO X-Spam-Level: X-Archive-Number: 200506/553 X-Sequence-Number: 13190 This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig993DD4397E8462A824F32F2F Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Merlin Moncure wrote: >I need a fast way (sql only preferred) to solve the following problem: > >I need the smallest integer that is greater than zero that is not in the >column of a table. In other words, if an 'id' column has values >1,2,3,4,6 and 7, I need a query that returns the value of 5. > >I've already worked out a query using generate_series (not scalable) and >pl/pgsql. An SQL only solution would be preferred, am I missing >something obvious? > >Merlin > > Not so bad. Try something like this: SELECT min(id+1) as id_new FROM table WHERE (id+1) NOT IN (SELECT id FROM table); Now, this requires probably a sequential scan, but I'm not sure how you can get around that. Maybe if you got trickier and did some ordering and limits. The above seems to give the right answer, though. I don't know how big you want to scale to. You might try something like: SELECT id+1 as id_new FROM t WHERE (id+1) NOT IN (SELECT id FROM t) ORDER BY id LIMIT 1; John =:-> --------------enig993DD4397E8462A824F32F2F Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (Cygwin) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFCwWfGJdeBCYSNAAMRAsNFAKCdYfJ4aZjw0bNhNnCcugH8qnn2ngCfTWTz Aus1toBGdKn7YRJA8ZePgmg= =JxB0 -----END PGP SIGNATURE----- --------------enig993DD4397E8462A824F32F2F--