#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