[SQL] difference between EXCEPT and NOT IN?
Hi, The 2 following statements don't give the same result. I expected the second ti give the exact same result as the first one. What am I missing? development=> SELECT id FROM entrees except select entree_id from postes ORDER BY id desc; id -- 3651 (1 row) development=> SELECT id FROM entrees WHERE id not in (select entree_id from postes) ORDER BY id desc; id (0 rows) thanks in advance for the help. Raph -- Web database: http://www.myowndb.com Free Software Developers Meeting: http://www.fosdem.org -- Sent via pgsql-sql mailing list ([email protected]) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-sql
Re: [SQL] difference between EXCEPT and NOT IN?
On Tue, Apr 1, 2008 at 6:04 PM, Stephan Szabo <[EMAIL PROTECTED]> wrote: > On Tue, 1 Apr 2008, Raphael Bauduin wrote: > > > The 2 following statements don't give the same result. I expected the > > second ti give the exact same result as the first one. > > If any entree_id can be NULL they aren't defined to give the same result. > > EXCEPT is defined in terms of duplicates based on distinctness, and for > example (1 is distinct from 1) is false, (1 is distinct from NULL) is true > and (NULL is distinct from NULL) if false. > > NOT IN is defined in terms of equality, and for example, (1=1) is true, > (1=NULL) is unknown and (NULL=NULL) is unknown. > My problem came from 2 entries in the table postes that had an entree_id NULL Thanks for your fast answer, it has helped me spot the problem! Raph -- Web database: http://www.myowndb.com Free Software Developers Meeting: http://www.fosdem.org -- Sent via pgsql-sql mailing list ([email protected]) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-sql
Re: [SQL] Trigger Procedure Error: NEW used in query that is not in a rule
HI,
On Sat, Aug 11, 2007 at 9:07 PM, hubert depesz lubaczewski
<[EMAIL PROTECTED]> wrote:
> On Sat, Aug 11, 2007 at 02:45:09AM -0500, Javier Fonseca V. wrote:
>> I think that it's working alright except for the next line:
>
> doing this in plpgsql is very complicated (or even impossible assuming
> that any table can have the same trigger). i would rather suggest using
> pl/perl - writing something like this in pl/perl is very simple.
>
I am in the same situation where I would like to execute a query similar to
EXECUTE 'INSERT INTO ' || quote_ident(SOMEDYNAMICNTABLENAME) || '
SELECT new.*';
I've looked at the plperl documentation, and experimented a bit, but
I'm not even sure how to start this in pl/perl. I hoped to extract
columns from $_TD->{new} but it doesn't seem to work.
Would you have a little example on how you would do it?
Thanks in advance!
Raph
> depesz
>
> --
> quicksil1er: "postgres is excellent, but like any DB it requires a
> highly paid DBA. here's my CV!" :)
> http://www.depesz.com/ - blog dla ciebie (i moje CV)
>
> ---(end of broadcast)---
> TIP 3: Have you checked our extensive FAQ?
>
> http://www.postgresql.org/docs/faq
>
--
Web database: http://www.myowndb.com
Free Software Developers Meeting: http://www.fosdem.org
--
Sent via pgsql-sql mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-sql
Re: [SQL] Trigger Procedure Error: NEW used in query that is not in a rule
On Wed, Sep 17, 2008 at 5:45 PM, hubert depesz lubaczewski
<[EMAIL PROTECTED]> wrote:
> On Wed, Sep 17, 2008 at 05:08:39PM +0200, Raphael Bauduin wrote:
>> Would you have a little example on how you would do it?
>
> show us what you have done - it will be easier to find/fix/explain than
> to write code for you.
Well, I experimented a lot but didn't come to any useful result.
Actually I'm working on table partitioning as described at
http://www.postgresql.org/docs/8.3/static/ddl-partitioning.html , and
I wanted to write a trigger that would insert the data in the correct
table, and so I got the same problem with plpsql's NEW.* not usable in
a dynamically created query to be run by EXECUTE:
CREATE OR REPLACE FUNCTION part_test() RETURNS TRIGGER AS $$
DECLARE
current_time timestamp := now();
suffix text := date_part('month', now())||'_'||date_part('day', now()) ;
BEGIN
RAISE NOTICE '%', suffix;
execute 'insert into t1_'||suffix||' values( NEW.* )';
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
I searched the archives here and after reading your previous mail in
this thread, I started to look at plperl, with which I have no
experience at all.
As $_TD{new}{column} gives the value of field column, I thought to
extract all columns from keys($_TD{new}), but it doesn't seem to see
$_TD{new} as a hash:
Type of arg 1 to keys must be hash (not hash element)
And that's where I'm at now.
Raph
>
> Best regards,
>
> depesz
>
> --
> Linkedin: http://www.linkedin.com/in/depesz / blog: http://www.depesz.com/
> jid/gtalk: [EMAIL PROTECTED] / aim:depeszhdl / skype:depesz_hdl / gg:6749007
>
--
Web database: http://www.myowndb.com
Free Software Developers Meeting: http://www.fosdem.org
--
Sent via pgsql-sql mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-sql
[SQL] inserting boolean values in dynamic queries
Hi, I'm building a dynamic query as described at http://www.postgresql.org/docs/8.3/interactive/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN : EXECUTE 'UPDATE tbl SET ' || quote_ident(colname) || ' = ' || quote_literal(newvalue) || ' WHERE key = ' || quote_literal(keyvalue); It works fine, except when I want to include a boolean value: the cast of newvalue from boolean to text causes problem. I can change my code and work with 't' and 'f' values as text, but wondered if there wasa way to use boolean values in a dynamically generated query. Thanks Raphaël -- Web database: http://www.myowndb.com Free Software Developers Meeting: http://www.fosdem.org -- Sent via pgsql-sql mailing list ([email protected]) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-sql
Re: [SQL] inserting boolean values in dynamic queries
On Thu, Sep 18, 2008 at 2:35 PM, Tom Lane <[EMAIL PROTECTED]> wrote:
> "Raphael Bauduin" <[EMAIL PROTECTED]> writes:
>> EXECUTE 'UPDATE tbl SET '
>> || quote_ident(colname)
>> || ' = '
>> || quote_literal(newvalue)
>> || ' WHERE key = '
>> || quote_literal(keyvalue);
>
>> It works fine, except when I want to include a boolean value: the cast
>> of newvalue from boolean to text causes problem.
>
> What problem? 'true' and 'false' are accepted as input for boolean
> AFAICS.
>
yes, but I have problems to use them to build the query passed to execute.
For example, working on this table
create table test(b_val bool);
I want to create a function that I cal call as
select test_bool(true)
and that will insert an entry in this test table.
Below are several attemps, all unsuccessful. The way I've made it work
it by accepting a char as input, t or f:
create or replace function test_bool(val char(1)) returns void as $$
create or replace function test_bool(val bool) returns void as $$
BEGIN
RAISE INFO 'insert into test(b_val) values (''%'')', val;
execute 'insert into test (b_val) values ('|| val || ')';
END
$$
language plpgsql;
--> ERROR: array value must start with "{" or dimension information
create or replace function test_bool(val bool) returns void as $$
BEGIN
RAISE INFO 'insert into test(b_val) values (''%'')', val;
execute 'insert into test (b_val) values ('|| val::text || ')';
END
$$
language plpgsql;
--> ERROR: cannot cast type boolean to text
create or replace function test_bool(val bool) returns void as $$
BEGIN
RAISE INFO 'insert into test(b_val) values (''%'')', val;
execute 'insert into test (b_val) values ('|| quote_literal(val) || ')';
END
$$
language plpgsql;
--> ERROR: function quote_literal(boolean) does not exist
I guess I'm missing something
Thanks.
Raphaël
>regards, tom lane
>
--
Web database: http://www.myowndb.com
Free Software Developers Meeting: http://www.fosdem.org
--
Sent via pgsql-sql mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-sql
[SQL] exists and is not null equivalence in query
Hi, In some code I am taking over, I found this query: select count(t.trame_id) as count, v.voiture_num as voitureNum from arch_trames t left join voiture v on (v.tag_id=t.tag_id) where (t.recept_time >= 1243509320691) and exists (select v2.voiture_num from voiture v2 where v2.tag_id=v.tag_id) group by v.voiture_num order by v.voiture_num Am I right that I can replace the "and exists..." clause by "and v.voiture_num is not null " in this case? Thanks Raphaël -- Web database: http://www.myowndb.com Free Software Developers Meeting: http://www.fosdem.org -- Sent via pgsql-sql mailing list ([email protected]) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-sql
