sql >> Databáze >  >> RDS >> Mysql

mysql, dotaz s podmínkou kde, pokud jedna hodnota =jakákoliv věc

K logickému seskupení položek klauzule WHERE použijte v dotazu hranaté závorky.

WHERE name = 'abc' AND (value = 12 OR 1=1)

Pokud se pokoušíte zadat dotaz, který přijímá dvě proměnné a vyhledává na základě těchto proměnných, jste ve své logice jen trochu mimo.

S oběma proměnnými

Za předpokladu, že máme dvě proměnné @incoming_name a @incoming_value :

SET @incoming_name = 'abc';
SET @incoming_value = 12;

SELECT * FROM table1 
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)

Tím získáte

1        abc       12

S jednou proměnnou dodanou

Pokud pak uživatel pro některou z těchto hodnot zadá hodnotu NULL, při hledání je přeskočí.

SET @incoming_name = 'abc';
SET @incoming_value = NULL;

SELECT * FROM table1 
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)

To vám stále poskytuje očekávaný výsledek

1        abc       12

Bez dodaných proměnných

Pokud uživatel nezadá žádnou z proměnných pro zúžení vyhledávání

SET @incoming_name = NULL;
SET @incoming_value = NULL;

SELECT * FROM table1 
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)

Všechny výsledky získáte z tabulky

1         abc             12
2         def             13
4         mkg             14
5         pcr             10

Použití proměnných ve skriptu

Při použití této metody nemusíte SET názvy proměnných v MySQL, to bylo jen pro demonstrační účely. Hodnotu z kódu/skriptu můžete vložit i do jiných jazyků. Například pomocí PHP a PDO Připravené výpisy

SELECT * FROM table1 
WHERE (:incoming_name = name OR :incoming_name IS NULL)
AND (:incoming_value = value OR :incoming_value IS NULL)

Potom můžete své uživatelské proměnné svázat s :incoming_name a :incoming_value a bude hledat, jak očekáváte. Pokud jsou některé z nich nulové, přeskočí je, jinak budou při hledání vyžadovány.

Upozornění: Tento kód jsem netestoval, je to jen pro hrubou představu, jak by to fungovalo. Používá PHP PDO a připravené příkazy, jak je zdokumentováno zde .

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

$stmt = $dbh->prepare("SELECT * FROM table1 
    WHERE (:incoming_name1 = name OR :incoming_name2 IS NULL)
    AND (:incoming_value1 = value OR :incoming_value2 IS NULL)");
$stmt->bindParam(':incoming_name1', $name);
$stmt->bindParam(':incoming_name2', $name);
$stmt->bindParam(':incoming_value1', $value);
$stmt->bindParam(':incoming_value2', $value);

if ($stmt->execute()) {
  while ($row = $stmt->fetch()) {
    var_dump($row);
  }
}

Každý parametr v dotazu musíte svázat se samostatným názvem, a proto, když chceme stejný parametr dvakrát, musíme mu dát samostatný název (incoming_value1 a incoming_value2 )



  1. Problémy s porovnáním SQL a hodnotami null

  2. Příprava serveru MySQL nebo MariaDB pro produkci – část první

  3. Funkce REGEXP_SUBSTR() v Oracle

  4. Jak vytvořit nové připojení k databázi v django