tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Yaslaw
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
552
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    unrealzero_php unrealzero_php ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    213
    Hallo zusammen,

    Ist es mit MySQL möglich, WHERE-Bedingungen anzugeben die nur in Kraft treten wenn die Subquery einen Wert zurück gibt?

    Beispiel:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    SELECT `tbl_address`.*
    FROM `tbl_address`
    WHERE `FK_state`=(SELECT `FK_state`
                     FROM `tbl_address_filter`
                     WHERE `FK_address`='123')
        AND `FK_category`=(SELECT `FK_category`
                     FROM `tbl_address_filter`
                     WHERE `FK_address`='123')
        AND `FK_country`=(SELECT `FK_country`
                     FROM `tbl_address_filter`
                     WHERE `FK_address`='123')
        AND `FK_type`= (SELECT `FK_type`
                     FROM `tbl_address_filter`
                     WHERE `FK_address`='123')

    Die ersten drei Bedinungen sind zwingend da FK_state, FK_category, FK_country Pflichtfelder sind.

    FK_type ist ein Zusatzfeld. Nun soll die Bedinung nur in Kraft treten wenn die Subquery:

    Code :
    1
    2
    3
    
    (SELECT `FK_type`
                     FROM `tbl_address_filter`
                     WHERE `FK_address`='123')

    einen Wert der nicht NULL ist zurückliefert.

    Kann ich so etwas mit MySQL abfragen oder muss ich einen anderen Ansatz wählen?
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    item: Ich rate dir dei 2 Tabellen mittels JOIN zu verbinden. Soviele Subqueries und alle auf denselben Datensatz sind subotpimal
    item: dann kannst du mit IFNULL ein wenig 'bescheisseisen' und im NULL-Fall den Wert von tbl_adress mit sich selber vergleichen

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    SELECT
        adr.*
    FROM
        tbl_address AS adr
        INNER JOIN tbl_address_filter AS fil
            ON adr.FK_state = fil.FK_state
            AND adr.FK_category = fil.FK_category
            AND adr.FK_country = fil.FK_country
            AND adr.FK_type = IFNULL(fil.FK_type, adr.FK_type)
    WHERE 
        fil.FK_address = '123'
    Geändert von Yaslaw (17.02.11 um 11:21 Uhr) Grund: t
    unrealzero_php bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  3. #3
    unrealzero_php unrealzero_php ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    213
    Soweit funktioniert das Statement ganz gut, wenn nun die beiden Werte adr.FK_type und fil.FK_type gleich NULL sind werden diese Datensätze nicht angezeigt, dann ich dies irgendwie umgehen? Es scheint wie wenn NULL = NULL nicht funktionieren würde.
    Code :
    1
    
    AND adr.FK_type = IFNULL(fil.FK_type, adr.FK_type)

    Nachtrag:

    Habe soeben einen Lösungsansatz gefunden. Gemäss MySQL gibt es ein "NULL-sicheres Gleich" welches auch bei NULL-Werten funktioniert: <=>
    Geändert von unrealzero_php (17.02.11 um 12:04 Uhr)
     

  4. #4
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Jepp. Ein Vergleich mit NULL ist immer NULL
    MySQL kennt darum auch den Vergleich <=>. Dieser vergleicht im Gegensatz zu = auch NULL
    Code sql:
    1
    
    AND adr.FK_type <=> IFNULL(fil.FK_type, adr.FK_type)
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  5. #5
    unrealzero_php unrealzero_php ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    213
    Wenn die Werte nun in einem Wertebereich liegen kann dann auch auf NULL-Werte geprüft werden?

    Beispiel:

    Code :
    1
    
    AND `adr`.`zip`>=IFNULL(`fil`.`zip`, `adr`.`zip`)

    Mit grösser gleich >= oder <= gleich
     

  6. #6
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Nope. Da hilft aber IFNULL(feld, 'NULL'). Also das man anstelle von NULL den String 'NULL' vergleicht
    Natürlich kann ans anstelle von 'NULL' auch etwas anderes nehmen. Wenn das Feld zum Beispiel immer NULL oder positive Zahlen hat, dann nimmt man -1 oder -99999 etc. Musst halt einfach ein Ersatzwert finden, der mit deinen Daten ein richtiges Resultat ergibt
    Code sql:
    1
    
    AND IFNULL(adr.zip, 'NULL')>=IFNULL(`fil`.`zip`, IFNULL(adr.zip, 'NULL'))
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

Ähnliche Themen

  1. Antworten: 64
    Letzter Beitrag: 17.12.10, 20:23
  2. Antworten: 9
    Letzter Beitrag: 08.09.10, 19:54
  3. Antworten: 7
    Letzter Beitrag: 22.10.08, 15:40
  4. [Matlab] Überprüfen ob eine Variable einen Wert enthält
    Von venom im Forum Sonstige Sprachen
    Antworten: 6
    Letzter Beitrag: 18.03.08, 11:22
  5. [Batch] Wenn Datei ein " enthält, dann mach das
    Von Azi im Forum Sonstige Sprachen
    Antworten: 4
    Letzter Beitrag: 07.10.05, 21:13