Запустите запрос MySQL, если условие истинно, иначе запустите другой запрос

#mysql #sql

#mysql #sql

Вопрос:

Мне нужно разделить столбец адреса на StreetName и streetNumber. Проблема иногда заключается в том, что полный адрес находится в столбце StreetName , а иногда и внутри столбца streetNumber. Я использую этот код для разделения replace(streetName, substring_index(streetName, ' ', -1), '') as
street,substring_index(streetName, ' ', -1) as number

и replace(streetNumber, substring_index(streetNumber, ' ', -1), '') as
street,substring_index(streetNumber, ' ', -1) as number.

Что я хочу сделать, это запустить этот раздел моего оператора запроса select, если StreetName равно нулю или пусто, выполните код с streetNumber и наоборот.

Я должен разделить ifStreet() и IfStreetNumber() в хранимой процедуре. Но при его запуске я получаю сообщение об ошибке, и если я помещаю код непосредственно в операторы case, он также не работает.Я получаю сообщение об ошибке, у вас ошибка в синтаксисе SQL. Возможно ли запустить базу запросов по условию или что не так с моим подходом? Спасибо,

   SELECT 
    firstName,
    lastName,
    D.email AS email,
    streetName,
    streetNumber,
    zipCode,
    city,
    IF(length(zipCode) =5,'Germany','') As country,
    registeredOn,
    N.email AS matchedEmail,
     CASE
        WHEN gender = 'Frau' OR gender = 'f' THEN 'f'
        WHEN gender = 'Herr' OR gender = 'm' THEN 'm'
        ELSE ''
    END AS Title,
    CASE
        WHEN gender = 'Frau' OR gender = 'f' THEN 'Frau'
        WHEN gender = 'Herr' OR gender = 'm' THEN 'Herr'
        ELSE ''
    END AS Salutation,
    CASE
        WHEN streetName !='' THEN 
          call ifStreet()
    ELSE 
           call ifStreetNumber()
    END

FROM
    matchFiles.TableA AS D
        INNER JOIN
    matchFiles.TableB AS N ON D.email = N.email
WHERE
    registeredOn <= '2018-08-31';
  

Комментарии:

1. Не должно возникнуть проблем с использованием для этого CASE или IF . И в вашем запросе уже есть (простые) примеры обоих из них. Если вы не можете получить правильный синтаксис, тогда, возможно, опубликуйте пример того, что не работает. Примечание: вам понадобятся два регистра или два IF, один для названия улицы и один для номера.

Ответ №1:

Хранимые процедуры не допускаются в операторах SELECT. Так что ваш подход не сработает.

Попробуйте перенести свою логику из хранимой процедуры в адекватный подзапрос.

Ответ №2:

Я реструктурировал запрос, а также удалил его с помощью хранимой процедуры. Я использую функцию IFNULL для чередования использования либо StreetName, либо streetNumber в зависимости от того, в каком столбце содержится строка полного адреса.

 replace(IFNULL(streetName,streetNumber), substring_index(IFNULL(streetName,streetNumber), ' ', -1), '') as street,substring_index(IFNULL(streetName,streetNumber), ' ', -1) as number