Можно ли использовать символ-заменитель при выборке по численному столбцу в MySQL?

Как можно настроить выборку данных из таблицы с несколькими столбцами целочисленного типа, основываясь на произвольном наборе столбцов? При этом, с фронтенда всегда приходит полный список столбцов, в котором для некоторых столбцов, которые не нужно фильтровать, указано значение 0. В настоящее время этот процесс реализован через составление запроса в PHP, но хотелось бы сделать обработку непосредственно в MySQL.
  • 24 октября 2023 г. 9:38
Ответы на вопрос 3
В MySQL можно использовать операторы IF и CASE для выполнения выборки данных на основе произвольного набора столбцов. 

Например, можно использовать оператор IF для проверки значения каждого столбца и фильтрации соответствующих строк. Вот пример:

```sql
SELECT *
FROM your_table
WHERE IF(column1 = 0, 1, column1) = column1
  AND IF(column2 = 0, 1, column2) = column2
  AND IF(column3 = 0, 1, column3) = column3
  ...
```

В этом примере мы проверяем каждое значение столбца. Если значение столбца равно 0, то вместо него используется значение 1 (которое не влияет на результат выборки). В противном случае, если значение столбца не равно 0, то используется его собственное значение. Затем мы сравниваем полученное значение со значением столбца, чтобы выполнить фильтрацию.

Можно использовать аналогичный подход с оператором CASE. Вот пример:

```sql
SELECT *
FROM your_table
WHERE CASE
  WHEN column1 = 0 THEN 1
  ELSE column1
END = column1
  AND CASE
    WHEN column2 = 0 THEN 1
    ELSE column2
  END = column2
  AND CASE
    WHEN column3 = 0 THEN 1
    ELSE column3
  END = column3
  ...
```

Оба этих подхода могут быть использованы для фильтрации выборки данных на основе произвольного набора столбцов, указанных с фронтенда.
Каким образом можно выполнить обработку прямо в MySQL? У вас все равно запрос формируется на PHP, как вы представляете себе выполнение запроса без PHP? 
 
Вместо использования оператора OR, который может быть неэффективным в MySQL, предпочтительнее формировать запрос, добавляя только нужные условия.
if ($value !== 0) {
  $where[] = '`column` = :value';
  $params['value'] = $value;
}
...
$where = implode(' AND ', $where);
Похожие вопросы