2013-03-06 2 views
0

У меня есть поле name со следующими строками:переформатирование таблицы данных SQL

`name` 
------ 
John Smith 
George Washington 
Ash Ketchum 
Bill O'Reilly 

Я хотел бы переформатировать строки на выходе:

`name` 
------ 
SMITH, JOHN 
WASHINGTON, GEORGE 
KETCHUM, ASH 
O'REILLY BILL 

Я знаю, что я могу использовать upper(x.name) для но как я могу переформатировать имена?

+3

Вы не можете ... А как насчет ROBERTO DA SILVA? Нераспределенные фамилии собираются разрушить все, что вы пытаетесь. Ваш единственный вариант, если вы хотите быть точным, - создать отдельный столбец для каждого элемента данных. Там, где у человека было только два имени, как ограниченное пространством, вы помещаете в эти столбцы. Остальное вам нужно сделать вручную ... – Ben

+0

Что делать, если у меня нет этих привилегий и вы можете работать только с данными. Не может ли быть какое-то выражение, использующее 'CASE WHEN'? –

+0

Да, вы можете приблизиться. Я хочу сказать, что данные хранятся некорректно для того, что вы хотите сделать. Поэтому вы не можете быть на 100% точным. Ваш лучший вариант - исправить вашу модель данных, для чего потребуется некоторая ручная работа или некоторые очень интеллектуальные парсеры. Любой полученный вами ответ по определению является неточным; хотя он может иметь дело с большинством случаев. – Ben

ответ

1

Предполагая, что ваш rdbms - mySql, ответ должен быть адаптирован к разным диалектам sql.

SELECT concat(substring(name, locate(name, ' ')), ', ', substring(name, 0, locate(name, ' ') - 1)) FROM NAMES; 

Настоящая проблема здесь, однако, целостность данных. Вам нужно иметь отдельные столбцы для каждого фрагмента имени, чтобы обеспечить целостность формирования в базе данных. В идеале вы хотели бы делать это -

Select concat(last_name, ', ', first_name) FROM NAMES; 

Разрешение

 'name' 
------------------- 
John Smith 
Smith, John 
J Smith 
Smith J 
John q Smith 
Jhon 'the smithmeister' Smith 

Все в той же колонке таблицы это плохо по ряду причин, так что это должно быть предотвращено Явно.

1

Попробуйте это:

SELECT SUBSTRING_INDEX(`name` , ' ', -1) + ', ' + SUBSTRING_INDEX(`name` , ' ', 1) 
FROM MyTable 

@Ben, делает хорошую точку об именах с несколькими пробелами в них. Я сомневаюсь, что это даст вам результат, который вы хотите в этих случаях, но он должен вас начать.

1

попробовать это

SELECT Concat(SUBSTRING_INDEX(`name` , ' ', -1) , ', ' , SUBSTRING_INDEX(`name` , ' ', 1)) as name 
FROM your_Table 
Смежные вопросы