Обсуждение: Why wont this update work?
Hi, trying to get this to work with pgsql, but it refuses to do anything... the table is called catalog. The field is called language and is a varchar(3) field. 81 of the records have the letter 'E' in the language field. i want to put 'NoD' in the rest. UPDATE catalog SET language = 'NoD' WHERE NOT language = 'E'; nor does UPDATE catalog SET language = 'NoD' WHERE language = 'NULL'; ........ or NULL and so on. I can change the 81 letter 'E's to anything I like, but can not UPDATE the blank fields.. can anyone tell me what I am missing here please? Thanks Bob --- http://4qir.quantum-radio.net.au - Where Only The Dedicated Survive! 4QIR Quantum Radio. Bringing you the original sounds of AFVN, with some of the original DJ's - back on air - and supporting not only the original Vets, in comprehensive AFVN Archives, but putting together segments for the fighting men and women of todays services all around the world. World Music, for people of the world.
Well "language" is an SQL reserved word. In Postgres it is a non-reserved key word, so it's probably not the problem but it may be worth seeing if changing the field name helps. Robert Chalmers wrote: > > Hi, > trying to get this to work with pgsql, but it refuses to do anything... > > the table is called catalog. The field is called language and is a > varchar(3) field. > 81 of the records have the letter 'E' in the language field. i want to > put 'NoD' in the rest. > > UPDATE catalog > SET language = 'NoD' > WHERE NOT language = 'E'; > > nor does > > UPDATE catalog > SET language = 'NoD' > WHERE language = 'NULL'; ........ or NULL and so on. > > I can change the 81 letter 'E's to anything I like, but can not UPDATE the > blank fields.. > > can anyone tell me what I am missing here please? > > Thanks > Bob > > --- http://4qir.quantum-radio.net.au - Where Only The Dedicated Survive! > 4QIR Quantum Radio. Bringing you the original sounds of AFVN, with some of > the > original DJ's - back on air - and supporting not only the original Vets, in > comprehensive AFVN Archives, but putting together segments for the fighting > men and > women of todays services all around the world. World Music, for people of > the world.
UPDATE catalog SET language = 'NoD' WHERE language IS NULL; Hope that helps, Jason Hi, trying to get this to work with pgsql, but it refuses to do anything... the table is called catalog. The field is called language and is a varchar(3) field. 81 of the records have theletter 'E' in the language field. i want to put 'NoD' in the rest. UPDATE catalogSET language = 'NoD'WHERE NOT language = 'E'; nor does UPDATE catalogSET language = 'NoD'WHERE language = 'NULL'; ........ or NULL and so on. I can change the 81 letter 'E's to anything I like, but can not UPDATE the blank fields.. can anyone tell me what I am missing here please? Thanks Bob --- http://4qir.quantum-radio.net.au - Where Only The Dedicated Survive! 4QIR Quantum Radio. Bringing you the originalsounds of AFVN, with some of the original DJ's - back on air - and supporting not only the original Vets, in comprehensiveAFVN Archives, but putting together segments for the fighting men and women of todays services all aroundthe world. World Music, for people of the world.
"Robert Chalmers" <robert@chalmers.com.au> writes: > UPDATE catalog > SET language = 'NoD' > WHERE language = 'NULL'; ........ or NULL and so on. > [ doesn't work ] WHERE language IS NULL is the SQL-standard-approved way of testing for NULL fields. (There's also IS NOT NULL if you need that.) If you have a sufficiently recent version of Postgres, it will also accept WHERE language = NULL (no quotes), but that's a nonstandard extension. (We only put it in because we had to for reasons of compatibility with Microsoft applications.) > UPDATE catalog > SET language = 'NoD' > WHERE NOT language = 'E'; This approach cannot work for finding nulls, because in expressions null essentially means "don't know" ... and that means it propagates. Is null equal to 'E'? The answer is "I don't know" --- another null. Feed that null to the NOT operator, and out comes another null. The buck stops at the WHERE clause, which is looking for a 'true' result ... but null isn't true either, so the tuple doesn't get selected. In short, no expression involving ordinary comparison and logic operators can produce anything but null when fed a null input. And that means you can't select tuples containing nulls with such an expression. This is why the standard decrees a special syntax for testing for null --- it's a very special operation. Microsoft's database code is in fact violating the standard by accepting field = NULL as meaning field IS NULL, because by rights field = NULL should always produce a null result (whether the field contains null or not!). regards, tom lane
<tt>Robert Chalmers ha scritto:</tt><blockquote type="CITE"><tt>Hi,</tt><br /><tt>trying to get this to work with pgsql,but it refuses to do anything...</tt><tt></tt><p><tt> the table is called catalog. The field is called language andis a</tt><br /><tt>varchar(3) field.</tt><br /><tt> 81 of the records have the letter 'E' in the language field. i wantto</tt><br /><tt>put 'NoD' in the rest.</tt><tt></tt><p><tt> UPDATE catalog</tt><br /><tt> SET language = 'NoD'</tt><br/><tt> WHERE NOT language = 'E';</tt><br /><tt></tt> </blockquote><tt>I think you have a NULL problem:</tt><tt></tt><p><tt>Thisquery doesn't work probably because the language column is always 'E' or NULL and NULL isan unknown value,</tt><br /><tt>therefore if you compare a NULL value with 'E' it is always FALSE.</tt><br /><tt></tt> <blockquote type="CITE"><tt></tt> <br /><tt>nor does</tt><tt></tt><p><tt> UPDATE catalog</tt><br /><tt> SET language = 'NoD'</tt><br /><tt> WHERE language = 'NULL'; ........ or NULL and so on.</tt><tt></tt><p><tt>Ican change the 81 letter 'E's to anything I like, but can not UPDATE the</tt><br /><tt>blank fields..</tt><tt></tt><p><tt>cananyone tell me what I am missing here please?</tt><br /><tt></tt> </blockquote><tt>This shouldwork:</tt><tt></tt><p><tt>UPDATE catalog SET language = 'NoD'</tt><br /><tt>WHERE language IS NULL --this forevery NULL value</tt><br /><tt>OR language <> 'E'; --and this one to everey value different from NULL</tt><tt></tt><p><tt>Example:</tt><tt></tt><p><tt>createtable catalog(id int, language varchar(3));</tt><br /><tt>CREATE</tt><br/><tt>insert into catalog values(1,'E');</tt><br /><tt>INSERT 150666 1</tt><br /><tt>insert into catalogvalues(2,'E');</tt><br /><tt>INSERT 150667 1</tt><br /><tt>insert into catalog values(3,'z');</tt><br /><tt>INSERT150668 1</tt><br /><tt>insert into catalog values(4);</tt><br /><tt>INSERT 150669 1</tt><br /><tt>insert intocatalog values(5);</tt><br /><tt>INSERT 150670 1</tt><br /><tt>insert into catalog values(6);</tt><br /><tt>INSERT 1506711</tt><br /><tt>select * from catalog;</tt><br /><tt>id|language</tt><br /><tt>--+--------</tt><br /><tt> 1|E</tt><br/><tt> 2|E</tt><br /><tt> 3|z</tt><br /><tt> 4|</tt><br /><tt> 5|</tt><br /><tt> 6|</tt><br /><tt>(6 rows)</tt><tt></tt><p><tt>select* from catalog where language = 'E';</tt><br /><tt>id|language</tt><br /><tt>--+--------</tt><br/><tt> 1|E</tt><br /><tt> 2|E</tt><br /><tt>(2 rows)</tt><tt></tt><p><tt>select * from catalog wherelanguage <> 'E';</tt><br /><tt>id|language</tt><br /><tt>--+--------</tt><br /><tt> 3|z</tt><br /><tt>(1 row)</tt><tt></tt><p><tt>select* from catalog where language <> 'E' or language is null;</tt><br /><tt>id|language</tt><br/><tt>--+--------</tt><br /><tt> 3|z</tt><br /><tt> 4|</tt><br /><tt> 5|</tt><br /><tt> 6|</tt><br/><tt>(4 rows)</tt><blockquote type="CITE"> <br />--- <a href="http://4qir.quantum-radio.net.au">http://4qir.quantum-radio.net.au</a>- Where Only The Dedicated Survive! <br />4QIRQuantum Radio. Bringing you the original sounds of AFVN, with some of <br />the <br />original DJ's - back on air -and supporting not only the original Vets, in <br />comprehensive AFVN Archives, but putting together segments for the fighting<br />men and <br />women of todays services all around the world. World Music, for people of <br />the world.</blockquote>______________________________________________________________ <br />PostgreSQL 6.5.0 on i586-pc-linux-gnu,compiled by gcc 2.7.2.3 <br />^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <br />José