mysql запрос отфильтровывает пустые или пустые строки - PullRequest
0 голосов
/ 23 апреля 2020

Я новичок в написании sql, поэтому заранее благодарю вас за любую помощь, которую вы можете оказать. У меня есть таблица (table1) в базе данных mysql, которая выглядит следующим образом:

+-----+----------+------------+
| id  | key      | value      |
+-----+----------+------------+
|   1 | name     | Bob        |
|   1 | location | ABC        |
|   1 | date     | xxxx-xx-xx |
|   2 | name     | Jim        |
|   2 | location | MID        |
|   2 | date     |            |
|   3 | name     |            |
|   3 | location |            |
|   3 | date     |            |
|   4 | name     | Sue        |
|   4 | location | DFW        |
|   4 | date     | xxxx-xx-xx |
|   5 | name     | Sue        |
|   5 | location |            |
|   5 | date     | xxxx-xx-xx |
|   6 | name     | Bob        |
|   6 | location | GRE        |
|   6 | date     | xxxx-xx-xx |
|   7 | name     |            |
|   7 | location |            |
|   7 | date     |            |
+-----+----------+------------+

Я создал представление, в котором я в основном инвертирую (поворачиваю) строки в столбцы следующим образом:

+-----+-------+----------+------------+
| id  | name  | location | date       |
+-----+-------+----------+------------+
|   1 | Bob   | ABC      | xxxx-xx-xx |
|   2 | Jim   | MID      |            |
|   3 |       |          |            |
|   4 | Sue   | DFW      | xxxx-xx-xx |
|   5 | Sue   |          | xxxx-xx-xx |
|   6 | Bob   | GRE      | xxxx-xx-xx |
|   7 |       |          |            |
|   8 | Bob   | DFW      | xxxx-xx-xx |
|   9 |       |          |            |
|  10 | Joe   | DFW      | xxxx-xx-xx |
|  11 |       |          |            |
|  12 |       |          |            |
|  13 |       |          |            |
|  14 | Jim   | SUS      | xxxx-xx-xx |
+-----+-------+----------+------------+

Вот код для того, как я это сделал:

select c.`id`, max(ifnull(c.name,NULL)) as name, max(ifnull(c.location,NULL)) as location, max(ifnull(c.date,NULL)) as date from (
select `id`,
case when `key` = 'name' then value end as name,
case when `key` = 'location' then value end as location,
case when `key` = 'date' then value end as date
  from `table1`
  WHERE value != ''
) c group by `id`

Мне нужно отфильтровать строки в представлении, где имя, местоположение и дата имеют значение NULL или пусто. Мне удалось очистить примерно половину строк, добавив WHERE value != '', но как мне отфильтровать остальные? WHERE value IS NOT NULL, похоже, не помогает.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Может быть, у вас есть пробелы в качестве значения? Попробуйте WHERE TRIM(value) != '' вместо.

Попробуйте это? WHERE name != '' OR location != '' OR date != ''

0 голосов
/ 24 апреля 2020

Я не понимаю, почему вы используете IFNULL() так, как вы это делаете. Например, max(ifnull(c.name,NULL)) эквивалентно max(c.name). Но вы можете использовать его в предложении HAVING для фильтрации пустых строк:

select c.`id`, 
  max(c.name) as name, 
  max(c.location) as location, 
  max(c.date) as date 
from (
select `id`,
  case when `key` = 'name' then value end as name,
  case when `key` = 'location' then value end as location,
  case when `key` = 'date' then value end as date
  from `table1`
  WHERE value != ''
) c group by `id`
having ifnull(name, '') <> '' or ifnull(location, '') <> '' or ifnull(date, '') <> ''

Если есть случай, когда имя, местоположение или дата - это не просто пустые строки, но используйте пробелы, затем используйте также trim() как:

having ifnull(trim(name), '') <> '' or ifnull(trim(location), '') <> '' or ifnull(trim(date), '') <> ''
...