Mysql
 sql >> база данни >  >> RDS >> Mysql

mysql, заявка с условност до къде, ако една стойност =всяко нещо

Използвайте скоби в заявката си, за да групирате логически елементите на клаузата WHERE.

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

Ако се опитвате да предоставите заявка, която приема две променливи, и търсите въз основа на тези променливи, вие съвсем малко се разминавате с логиката си.

С предоставените и двете променливи

Ако приемем, че имаме две променливи @incoming_name и @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)

Това ще ви даде

1        abc       12

С предоставена една променлива

След това, ако потребителят предостави NULL за някоя от тези стойности, той ще ги пропусне при вашето търсене.

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)

Това все още ви дава очаквания резултат

1        abc       12

Без предоставени променливи

Ако потребителят не предостави нито една от променливите, за да стесните търсенето

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)

Ще получите всички резултати от таблицата

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

Използване на променливи във вашия скрипт

Използвайки този метод, не е необходимо да SET имена на променливи в MySQL, това беше само за демонстрационни цели. Можете да поставите стойността от вашия код/скрипт и на други езици. Например с помощта на PHP и PDO подготвени отчети

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

След това можете да свържете вашите потребителски променливи към :incoming_name и :incoming_value и ще търси, както очаквате. Ако някой от тях е null, той ще ги пропусне, в противен случай те ще бъдат необходими при търсенето.

Предупреждение: Не съм тествал този код, само за да ви дам груба представа как ще работи. Той използва PHP PDO и подготвени изрази, както е документирано тук .

$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);
  }
}

Трябва да обвържете всеки параметър в заявката с отделно име, поради което, когато искаме един и същ параметър два пъти, трябва да му дадем отделно име (incoming_value1 и incoming_value2 )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Импортирайте дъмп файла на MySQL в MSSQL

  2. Съхранение на динамични данни от формуляр в СУБД, търсене на оптимален подход

  3. Ограничете броя на редовете, към които да се присъедините, в mysql

  4. Кой е най-лесният начин за добавяне на празни дати в sql резултати (в края на mysql или perl)?

  5. Проблем с инсталацията на Ruby on Rails (Windows)