MySQL изменение результата запроса в зависимости от условия - PullRequest
0 голосов
/ 26 мая 2020

Я использую версию mysql для mariaDB, и мой результат запроса следующий

select count(*) as 'Non-HT Computes', vcpus_used as 'Status'
from compute_nodes
WHERE deleted_at is NULL
  AND hypervisor_hostname LIKE '%sriov%'
  AND vcpus < '21'
GROUP BY vcpus_used

+-----------------+--------+
| Non-HT Computes | Status |
+-----------------+--------+
|              20 |      0 |
|               5 |     16 |
+-----------------+--------+

Это то, что я пытаюсь сделать, если в столбце Status значение 0, затем выведите Available и если значение находится в диапазоне от 16 до 20 значение печати In-used, как мне изменить результат возвращаемых значений на лету?

Окончательный результат должен выглядеть как

+-----------------+----------------+
| Non-HT Computes |      Status    |
+-----------------+----------------+
|              20 |     Available  |
|               5 |     In-Used    |
+-----------------+----------------+

Я пробовал использовать оператор CASE, но не знаю, как его совместить со столбцом alias Status, потому что Status псевдо столбец.

Изменить:

Я зашел так далеко, но не могу узнать, как напечатать Non-HT Computes таблицу: (

select CASE WHEN Status = 0 THEN 'available' ELSE 'In-used' END AS Status from (select count(*) as 'Non-HT Computes',vcpus_used as 'Status' from compute_nodes WHERE deleted_at is NULL AND hypervisor_hostname LIKE '%sriov%' AND vcpus < '21' GROUP BY vcpus_used) as a
+-----------+
| Status    |
+-----------+
| available |
| In-used   |
+-----------+

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Первый вариант - использовать CASE:

SELECT count(*) AS 'Non-HT Computes',
       CASE
           WHEN vcpus_used = 0 THEN 'Available'
           WHEN vcpus_used >= 16 AND vcpus_used <= 20 THEN 'In-use'
       END  AS 'Status'
FROM compute_nodes
WHERE deleted_at IS NULL
  AND hypervisor_hostname LIKE '%sriov%'
  AND vcpus < '21'
GROUP BY vcpus_used

Второй вариант - создать таблицу со значениями статуса (0, 16, 20) и присоединиться к этой таблице.

CREATE TABLE status_text (
    id INT PRIMARY KEY,
    descr VARCHAR(32)
);

INSERT INTO status_text VALUES (0,'Available');
INSERT INTO status_text VALUES (16,'In-use');
INSERT INTO status_text VALUES (20,'In-use');

SELECT count(*) AS 'Non-HT Computes',descr AS status
FROM compute_nodes
JOIN status_text ON (id=vcpus_used) 
WHERE deleted_at IS NULL
  AND hypervisor_hostname LIKE '%sriov%'
  AND vcpus < '21'
GROUP BY vcpus_used
2 голосов
/ 27 мая 2020

Это может сработать. Если вы хотите ограничить после ненулевых случаев, вы можете использовать оператор having.

SELECT count(*) AS 'Non-HT Computes',
       CASE
           WHEN vcpus_used BETWEEN 16 AND 20 THEN "In-used"
           WHEN vcpus_used = 0 THEN "Available"
           ELSE "Non-Zero"
           END AS Status
FROM compute_nodes
WHERE deleted_at IS NULL
  AND hypervisor_hostname LIKE '%sriov%'
  AND vcpus < '21'
GROUP BY vcpus_used;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...