как получить данные, если значение существует, иначе вернуть значение по умолчанию - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть эти две данные из моей базы данных, единственное отличие которых заключается в их статусе

id   |   userId    |  status   |  dateCreated
1    |     1       |  pending  |   2019-02-09 22:11:11
2    |     1       |  complete |   2019-02-10 10:40:20

. Я хотел получить данные со статусом complete, если статус complete существует на основепо идентификатору еще получить статус pending, если complete статус не существует

я попытался использовать инструкцию SELECT CASE, но что происходит, он возвращает как ожидающий, так и полный статус

причина, по которой яне просто обновить 1-е данные для отчетов.

есть ли способ получить это?вот мой пример запроса.

SELECT userId,
CASE
    WHEN status = 'completed' THEN "completed"
    ELSE "pending"
END AS status
FROM tbltransaction where userId = '1'

Ответы [ 3 ]

0 голосов
/ 09 февраля 2019

С EXISTS:

SELECT userId,
  CASE
    WHEN EXISTS (SELECT 1 FROM tbltransaction WHERE userId = '1' AND status = 'completed') THEN 'completed'
    ELSE 'pending'
  END AS status
FROM tbltransaction where userId = '1'
0 голосов
/ 09 февраля 2019

Я могу ошибаться, но из того, что вы описываете, похоже, что вы хотите получить последний статус для данного идентификатора пользователя.Я также предполагаю, что id - это столбец автоинкремента.Если это так, то, возможно, вы можете попробовать это

SELECT userId, status FROM tbltransaction tbl1
INNER JOIN
(
  SELECT userId, max(id) as max_id
  FROM tbltransaction 
  GROUP BY userId
) tbl2
ON tbl1.userId = tbl2.userId
AND tbl1.id = tbl2.max_id;

Это вернет последний статус для всех пользователей в соответствии с вышеуказанными предположениями.

Надеюсь, это поможет!Ура!

0 голосов
/ 09 февраля 2019

Агрегация возвращает по одной строке на пользователя:

SELECT userId,
       (CASE WHEN SUM(status = 'completed') > 0 THEN 'completed'
             ELSE 'pending'
        END) AS status
FROM tbltransaction 
WHERE userId = 1
GROUP BY userId;

В качестве альтернативы, если вы заботитесь только об одном пользователе, вы можете использовать:

SELECT 1 as userId,
       (CASE WHEN EXISTS (SELECT 1
                          FROM tbltransaction t
                          WHERE t.userId = 1 AND
                                t.status = 'completed'
                         )
             THEN 'completed'
             ELSE 'pending'
         END)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...