#mysql #sql #plsql
#mysql #sql #plsql
Вопрос:
Всем доброго дня,
Прежде всего, спасибо за попытку помочь. Мой вопрос заключается в следующем: я пытаюсь написать SQL-запрос, который выполнит следующее:
- Когда пользователь вводит определенный код терминала, sql возвращает результаты для этого терминала
- Когда пользователь вводит код терминала с маской,
'CN'
тогда sql-запрос возвращает все терминалы, которые есть'CN'
в начале этого терминала
Я знаю, что ill, вероятно, потребуется использовать CASE
здесь.
Пока я получил:
SELECT
sm.terminalid as terminalcode,
sm.sums as Latest_sums
FROM sums1 sm
... CASE
WHEN sm.terminalid = :p_terminal
THEN sm.sums = (
SELECT max(ss.sums) from sums ss WHERE ss.terminalid = :p_terminal
)
WHEN sm.terminalid = :p_terminal AND :p_terminal LIKE 'CN%'
THEN sm.sums = (
SELECT sm1.sums FROM sums1 sm1 WHERE sm1.terminalid = :p_terminal
AND :p_terminal LIKE 'CN%'
)
ELSE 'Incorrect Terminal ID'
END
Кто-нибудь может мне помочь, где я ошибаюсь, поскольку выбор не возвращает несколько результатов при CN
вводе.
Также, если у кого-нибудь есть лучшее решение этой задачи, пожалуйста, не стесняйтесь поделиться.
Заранее благодарю вас.
Ответ №1:
Для меня ваша логика выбора записей должна быть выражена как условие в WHERE
предложении, например:
(:p_terminal LIKE 'CN%' AND sm.terminalid like 'CN%')
OR (:p_terminal NOT LIKE 'CN%' AND sm.terminalid = :p_terminal)
Когда заданный параметр выглядит начинающимся с 'CN'
, выбираются все записи, где terminalid
начинается с 'CN'
. В противном случае он выбирает записи, где terminalid
равно параметру.
Запрос:
SELECT
sm.terminalid as terminalcode,
sm.sums as Latest_sums
FROM sums1 sm
WHERE
(:p_terminal LIKE 'CN%' AND sm.terminalid like 'CN%')
OR (:p_terminal NOT LIKE 'CN%' AND sm.terminalid = :p_terminal)
Комментарии:
1. Имеет смысл, я перепишу это сегодня вечером и посмотрю, что я получу, спасибо
2. @YuriyTimoshenkov: запрос у вас нормально сработал? Если это произошло, пожалуйста, примите ответ, щелкнув зеленый флажок. В противном случае, пожалуйста, дайте мне знать, что не так. Спасибо!
3. Извините, мой друг отсутствовал в течение 2 недель, путешествуя, я протестирую это сегодня и сообщу вам о результате
4. Я пробовал запрос, да, он выбирает несколько терминалов, однако теперь, когда вы вводите определенный терминал, он по-прежнему выбирает их все.
5. я поиграю с этим, я думаю, что проблема во второй четверти.
Ответ №2:
SELECT sm.terminalid as terminalcode, sm.sums as sums,
FROM sums sm
WHERE sm.terminalid LIKE :p_terminal || '%'