Home » Non-English Forums » German » SQL mit verschiedenen Variablen
SQL mit verschiedenen Variablen [message #483080] Thu, 18 November 2010 04:25 Go to next message
dior
Messages: 25
Registered: April 2009
Junior Member
Hallo,
ich habe ein Problem mit einer Abfrage! ich habe 3 Variable die ich über eine php Seite eingebe und in die SQL einbaue um das ergebnis einzuschränken. Allerdings bekomme ich das nicht ganz zusammen ohne hilfe! Sad

Select ... ... ... 
From ... ... ...
Where ... ... ... 
 AND (ST.CAB like '$lnr' OR S.SUB = '$nb' OR ST.FID = '$fid')


Wenn ich jetzt eine Eingabe mache kommt das Ergebnis für eben genau eine dieser Eingaben.

Meine Frage ist jetzt, wie kann ich es machen, das 2 oder alle 3 Eingaben berücksichtigt werden.
(also $lnr and $nb and $fid;
oder nur $lnr and $nb
oder $lnr and $ fid oder ...)

also das alle möglichen Fälle abgedeckt werden??

Re: SQL mit verschiedenen Variablen [message #483086 is a reply to message #483080] Thu, 18 November 2010 05:24 Go to previous messageGo to next message
ramoradba
Messages: 2456
Registered: January 2009
Location: AndhraPradesh,Hyderabad,I...
Senior Member
Es ist nicht klar! Ich vermute, Sie haben bei sachgemäßer Verwendung von "OR" suchen, "AND"
Wenn es nicht Ihre Anforderung Bitte erklären Sie es eindeutig, sodass wir versuchen Ihnen zu helfen.

Sriram
Re: SQL mit verschiedenen Variablen [message #483089 is a reply to message #483086] Thu, 18 November 2010 06:05 Go to previous messageGo to next message
dior
Messages: 25
Registered: April 2009
Junior Member
ok:

ich habe 3 variable die ich eingebe.
egal ob ich nur eine eingebe, 2 oder alle 3 ich möchte immer ein Ergebnis eingeschränkt durch den/die eingegebenen Wert(e) bekommen.

-wenn ich eine variable eingebe (egal welche), die anderen 2 nicht dann will ich das ergebnis so haben, dass die sql abfrage inklusive der einegegebene variable gemacht wird.
-wenn ich 2 variablen eingebe und eine nicht dann sollen die beiden berücksichtigt werden bei der abfrage
-wenn alle 3 eingegeben werden natürlich alle 3 berücksichtigt

bsp:

oracle tabelle:
[b]lnr	nb	fid	xy	123[/b]
1	fff	1a	xy	123
1	ddd	2w	xy	123
2	sss	1a	xy	123
2	eee	4r	xy	123
3	kkk	3r	xy	123
3	ooo	5f	xy	123



Eingabewerte:
nur $lnr = 2
Ergebnis:
2	sss	1a	xy	123
2	eee	4r	xy	123


Eingabewerte:
$lnr = 1
$fid = 1a
Ergebnis:
1	fff	1a	xy	123


Eingabewerte:
$lnr = 1
$fid = 1a
$nb = sss
Ergebnis:
"kein Eintrag gefunden" -- Meldung muss nicht ausgegeben werden!

[Updated on: Thu, 18 November 2010 06:16]

Report message to a moderator

Re: SQL mit verschiedenen Variablen [message #483095 is a reply to message #483089] Thu, 18 November 2010 07:05 Go to previous messageGo to next message
ThomasG
Messages: 3211
Registered: April 2005
Location: Heilbronn, Germany
Senior Member
Kommt etwas darauf an, was das entsprechende Frontend aus der "Eingabe" macht.

Eine Variante, die ich oft verwende, wenn die "nicht eingegebene" variabe null ist:

where   ( column1 = var1 or var1 is null)
    and ( column2 = var2 or var2 is null)
    and ( column3 = var3 or var3 is null)


Re: SQL mit verschiedenen Variablen [message #483097 is a reply to message #483095] Thu, 18 November 2010 07:15 Go to previous messageGo to next message
dior
Messages: 25
Registered: April 2009
Junior Member
Danke... ich hatte es schonmal in der art und weise, aber da ging es nicht! ich schätze da hatte ich irgend ein problem.

So funktioniert es Smile danke


Re: SQL mit verschiedenen Variablen [message #483154 is a reply to message #483097] Thu, 18 November 2010 13:27 Go to previous messageGo to next message
_jum
Messages: 577
Registered: February 2008
Senior Member
Etwas "hübscher" ist vielleicht die Verwendung von NVL:
WITH para AS
 (SELECT 1 p1, 'fff' p2, NULL p3   FROM dual),
    data AS 
 (SELECT 1 lnr, 'fff' nb, '1a' fid FROM dual UNION ALL
  SELECT 1    , 'fff'   , '1b'     FROM dual UNION ALL
  SELECT 1    , 'ddd'   , '2w'     FROM dual UNION ALL
  SELECT 2    , 'sss'   , '1a'     FROM dual UNION ALL
  SELECT 2    , 'eee'   , '4r'     FROM dual UNION ALL
  SELECT 3    , 'kkk'   , '3r'     FROM dual UNION ALL
  SELECT 3    , 'ooo'   , '5f'     FROM dual)
SELECT data.* FROM data, para
 WHERE NVL(p1,lnr)=lnr AND NVL(p2,nb)=nb AND NVL(p3,fid)=fid;


       LNR NB  FID
---------- --- ---
         1 fff 1a 
         1 fff 1b 
Re: SQL mit verschiedenen Variablen [message #483236 is a reply to message #483080] Fri, 19 November 2010 06:33 Go to previous messageGo to next message
Frank
Messages: 7901
Registered: March 2000
Senior Member
dior wrote on Thu, 18 November 2010 11:25

Where ... ... ...
AND (ST.CAB like '$lnr' OR S.SUB = '$nb' OR ST.FID = '$fid')

Mein Deutsch ist nicht so gut, aber ich will dich aufmerksam machen auf ein Gefahr in dein Kode. Lese diese Information ueber SQL-Injection. Es war die beste der ich finden konnte in Deutsch; es gibt viel mehr Info in English
Re: SQL mit verschiedenen Variablen [message #483238 is a reply to message #483095] Fri, 19 November 2010 06:51 Go to previous messageGo to next message
dior
Messages: 25
Registered: April 2009
Junior Member
noch ein problem, das mit
where   ( column1 = var1 or var1 is null)
    and ( column2 = var2 or var2 is null)
    and ( column3 = var3 or var3 is null)

funktioniert sehr gut! aber beim ersten aufruf der Seite wird die Abfrage mit den Null Werten gestartet und liefert das komplette ergebnis! dies dauert relativ lange.

wie kann ich das verhindern bzw. erst starten wenn ich einen wert eingegeben habe und auf den "start" knopf gedrückt habe?

(ich habe probiert der Variable am geginn einen Wert zuzuweisen, aber dann ignoriert er die eingebewerte und liefert kein ergebnis)
Re: SQL mit verschiedenen Variablen [message #483278 is a reply to message #483238] Fri, 19 November 2010 11:59 Go to previous messageGo to next message
ThomasG
Messages: 3211
Registered: April 2005
Location: Heilbronn, Germany
Senior Member
Einfach nur logisch verknüpfen:

Wenn alle vars null sind soll er nichts zurückliefern?

"alle vars null" ist :

(var1 IS NULL and var2 IS NULL AND var3 IS NULL)


Es soll nur was zurückgegeben werden, wenn das NICHT der Fall ist. Also ein zusätzliches AND mit einem NOT:

where   ( column1 = var1 or var1 is null)
    and ( column2 = var2 or var2 is null)
    and ( column3 = var3 or var3 is null)
    and not (var1 IS NULL and var2 IS NULL AND var3 IS NULL)
Re: SQL mit verschiedenen Variablen [message #483453 is a reply to message #483278] Mon, 22 November 2010 04:44 Go to previous messageGo to next message
dior
Messages: 25
Registered: April 2009
Junior Member
DANKE!!
Re: SQL mit verschiedenen Variablen [message #483467 is a reply to message #483154] Mon, 22 November 2010 05:35 Go to previous messageGo to next message
ThomasG
Messages: 3211
Registered: April 2005
Location: Heilbronn, Germany
Senior Member
_jum wrote on Thu, 18 November 2010 20:27
Etwas "hübscher" ist vielleicht die Verwendung von NVL:


Aber Achtung, dann kann es sein dass der Optimizer keinen Index auf betreffenden Spalten mehr verwenden kann, da die Spalten in einer Funktion drin sind.

SQL> set autotrace traceonly
SQL> SELECT * FROM
  2    test
  3     WHERE Nvl(NULL,col) = '12';

no rows selected

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=3348 Card=3786 Bytes=1037364)
   1    0   TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=3348 Card=3786 Bytes=1037364)


Statistics
----------------------------------------------------------
         15  recursive calls
          0  db block gets
      15168  consistent gets
      15136  physical reads
          0  redo size
       2387  bytes sent via SQL*Net to client
        235  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

SQL>
SQL> SELECT * FROM
  2    test
  3     WHERE col = '12' OR NULL IS NOT NULL;

no rows selected


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=1 Bytes=274)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (TABLE) (Cost=4 Card=1 Bytes=274)
   2    1     INDEX (RANGE SCAN) OF 'TEST_INDEX002' (INDEX) (Cost=3 Card=1)

Statistics
----------------------------------------------------------
         15  recursive calls
          0  db block gets
          7  consistent gets
          2  physical reads
          0  redo size
       2394  bytes sent via SQL*Net to client
        235  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

SQL>


(Man beachte besonders den unterschied in consistent gets
und physical reads in dem Beispiel hier (Tabelle mit ca.400 000 Zeilen)

Genau damit bin ich nämlich schon mal auf die Nase gefallen. Very Happy

[Updated on: Mon, 22 November 2010 05:36]

Report message to a moderator

Re: SQL mit verschiedenen Variablen [message #483500 is a reply to message #483467] Mon, 22 November 2010 09:43 Go to previous message
_jum
Messages: 577
Registered: February 2008
Senior Member
Jupp, das kann ins Auge gehen - vielen Dank für den Tip!
Previous Topic: searching for good DBA training in germany
Next Topic: Umlaute ersetzen
Goto Forum:
  


Current Time: Thu Mar 28 09:30:13 CDT 2024