Проблема с sql-запросом при выборе одного результата или нескольких результатов

#mysql #sql #plsql

#mysql #sql #plsql

Вопрос:

Всем доброго дня,

Прежде всего, спасибо за попытку помочь. Мой вопрос заключается в следующем: я пытаюсь написать SQL-запрос, который выполнит следующее:

  1. Когда пользователь вводит определенный код терминала, sql возвращает результаты для этого терминала
  2. Когда пользователь вводит код терминала с маской, '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 || '%'