SQL mit verschiedenen Variablen [message #483080] |
Thu, 18 November 2010 04:25 |
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!
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 #483089 is a reply to message #483086] |
Thu, 18 November 2010 06:05 |
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:
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 |
ThomasG
Messages: 3212 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 #483154 is a reply to message #483097] |
Thu, 18 November 2010 13:27 |
_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 |
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 |
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 |
ThomasG
Messages: 3212 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 #483467 is a reply to message #483154] |
Mon, 22 November 2010 05:35 |
ThomasG
Messages: 3212 Registered: April 2005 Location: Heilbronn, Germany
|
Senior Member |
|
|
_jum wrote on Thu, 18 November 2010 20:27Etwas "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.
[Updated on: Mon, 22 November 2010 05:36] Report message to a moderator
|
|
|
|