2014-11-25 2 views
0

В нашей БД есть столбец имен, и я пытаюсь выбрать первое и последнее использование, но данные используют либо | или пространственных разделителей. Прямо сейчас наш код работает для имен пространства, но мне нужно, чтобы он разделился на один.mysql найти несколько разделителей

table.name
первый последний
first2 | last2

select substr(upper(mid(vo.name, 1, locate(' ',vo.name)-1)),1,20) as 'First Name', 
     substr(upper(mid(vo.name, locate(' ',vo.name)+1, 100)),1,20) as 'Last Name' 
from table vo 

Есть ли способ, чтобы искать любой из них?

+0

Прежде всего, пытаясь беспокоиться о имени и фамилии, это немного бесполезное упражнение. Я со временем обнаружил, что существует так много разных вариантов имен, которые я обычно предоставляю только для одного поля имени и позволяю людям вводить данные в свободную форму. При этом, если вы настаиваете на соглашении о первом/последнем имени, почему бы вам не сначала пройти и дезинформировать свои данные в один формат, а затем начать принудительное вложение данных только в этом формате? –

+0

У меня нет контроля над фактической фиксацией проблемы, т.е. дезинфекции данных и обеспечения правильного ввода данных. Я должен доставить эти данные поставщику в первом последнем формате. Поверь мне, это был бы не мой первый выбор. – jasonrfisher

ответ

0

В результате я вложил вложенную функцию replace() для сантирования встроенных данных, но я чувствую, что может быть более чистый способ.

SELECT 
     UPPER(SUBSTRING(vo.name, 1, LOCATE(' ', REPLACE(vo.name, '|', ' ')) - 1)) as 'First Name', 
     UPPER(SUBSTRING(vo.name, LOCATE(' ', REPLACE(vo.name, '|', ' ')) + 1)) as 'Last Name' 
from table vo 
0
SELECT LEFT('FirstName|LastName', CHARINDEX (' ', 'FirstName|LastName') + CHARINDEX ('|', 'FirstName|LastName')-1) 
SELECT RIGHT('FirstName|LastName', CHARINDEX (' ', 'FirstName|LastName') + CHARINDEX ('|', 'FirstName|LastName')-2) 

это если есть только один из '|' или '' - в противном случае это может сработать:

SELECT LEFT('FirstName |LastName', CHARINDEX (',', REPLACE(REPLACE(REPLACE('FirstName |LastName', ' ', ','), '|', ','), ',,', ','))-1) 
Смежные вопросы