Avatar billede Søren Bech Morsing Praktikant
20. april 2004 - 14:09 Der er 11 kommentarer og
1 løsning

IN virker ikke efter hensigten

Hvis jeg skriver:
NOT 4 IN (3,4,5) burde jeg få false - ikke?
- og IN (4,6,a,5,e) er vel ok at blande bogstaver tal?
Eller kan IN ikke kombineres med NOT måske?
Avatar billede umfugo Nybegynder
20. april 2004 - 14:12 #1
Det er  "4 not in (3,4,5)"
Avatar billede pnielsen Nybegynder
20. april 2004 - 14:13 #2
Det hedder vel "where 4 not in (3,4,5)" ??

og jeg tror du skal bruge to_char hvis du vil blande.
where e not in ('4',6,'a','5','e');
where to_char(4) not in ('4',6,'a','5','e');
Avatar billede pnielsen Nybegynder
20. april 2004 - 14:14 #3
var vel et svar...
Avatar billede pnielsen Nybegynder
20. april 2004 - 14:16 #4
og så en lille sjov en....

NOT IN Operator Evaluates to False if Subquery Returns Null:

Test Case:

  SQL> create table test_main(m_id number);
  SQL> create table test_sub(s_id number);
  SQL> insert into test_main(m_id) values (1);
  SQL> insert into test_sub(s_id) values (2);
  SQL> insert into test_sub(s_id) values (null);
  SQL> commit;
  SQL> select * from test_main
        where m_id not in (select s_id from test_sub);
  /*no rows selected*/

  SQL> select * from test_main
        where m_id not in (select s_id from test_sub where s_id is not null);
  /* returns:
        M_ID
  ---------
          1
  */
   
But IN operator evaluates to true if any member of subquery's result
set equals to left value.

Example:

  SQL> delete from test_sub;
  SQL> insert into test_sub(s_id) values (1);
  SQL> insert into test_sub(s_id) values (null);
  SQL> commit;
  /*following subquery will return (1,null)*/
  SQL> select * from test_main
        where m_id in (select s_id from test_sub);
  /* returns:
    M_ID
  ---------
          1
  */ 

*Note:  This is not a bug.  It works as designed.

Description of NOT IN operator (Oracle Server SQL Reference Manual=> Operators, Functions, Expressions, Conditions):

  Equivalent to "!=ALL".Evaluates to FALSE if any member 
  of the set is NULL.

This means that the following query: 

  SQL> select * from scott.emp
        where empno NOT IN (1,null);

will return 0 rows.

This is very tricky and many developers are not aware of this.
Avatar billede Søren Bech Morsing Praktikant
20. april 2004 - 14:43 #5
tror jeg plejer at skrive
WHERE NOT 1 = 2 og ikke WHERE 1 NOT = 2 ?
korrekt?

derfor jeg skrev på den måde jeg skrev - jeg fandt også selv på det inden jeg læste din ganske udemærkede forklaring - takker.
Avatar billede pnielsen Nybegynder
20. april 2004 - 14:46 #6
ville nok skrive WHERE 1 != 2
Avatar billede arne_v Ekspert
20. april 2004 - 14:51 #7
Jeg ville skrive WHERE 1 <> 2, men ...
Avatar billede pnielsen Nybegynder
20. april 2004 - 15:45 #8
det er vel egenligt også ligemeget så længe vi snakker konstanter ? hehe
kunn forstå hvis vi snakkede variabler a <> b eller a != b

1 er vel altid forskellige fra 2, så det udsagn er vel lidt ligegyldigt, eller ? Men Ok.. alt er relativt
Avatar billede Søren Bech Morsing Praktikant
20. april 2004 - 15:53 #9
virker !=
Mener ikke jeg kan få det til at virke i fx Access - for det er da mere logisk end NOT ;)
Avatar billede arne_v Ekspert
20. april 2004 - 16:00 #10
Jeg mener at SQL standard er <> men en del databaser understøtter !=
Avatar billede pnielsen Nybegynder
20. april 2004 - 16:14 #11
ja != virker i Oracle - men det er som Arne siger nok ikke den gængse sql standard.
Brug <> hvis du vil følge den gængse ANSI/SQL99 standard (SQL3) - ellers så brug det du syntes er nemmest. Så længe det virker. Sommetider er der forskel på performance, om du bruger standarden eller en modificeret version skrevet til den database du arbejder med. Men det er jo ikke nyt i vores verden....
Avatar billede Søren Bech Morsing Praktikant
20. april 2004 - 16:21 #12
jeg siger mange tak for snakken - så fik jeg klaret "2" ting i dag.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester