WHERE-Bedingung nur wenn Subquery Wert einen enthält?

unrealzero_php

Erfahrenes Mitglied
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:
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:
(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?
 
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

SQL:
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'
 
Zuletzt bearbeitet von einem Moderator:
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:
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: <=>
 
Zuletzt bearbeitet:
Jepp. Ein Vergleich mit NULL ist immer NULL
MySQL kennt darum auch den Vergleich <=>. Dieser vergleicht im Gegensatz zu = auch NULL
SQL:
AND adr.FK_type <=> IFNULL(fil.FK_type, adr.FK_type)
 
Zuletzt bearbeitet von einem Moderator:
Wenn die Werte nun in einem Wertebereich liegen kann dann auch auf NULL-Werte geprüft werden?

Beispiel:

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

Mit grösser gleich >= oder <= gleich
 
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
SQL:
AND IFNULL(adr.zip, 'NULL')>=IFNULL(`fil`.`zip`, IFNULL(adr.zip, 'NULL'))
 
Zuletzt bearbeitet von einem Moderator:
Zurück