Манипуляции со строками в столбце в таблице Oracle - PullRequest
0 голосов
/ 08 октября 2011

Столбец одной из моих таблиц содержит имена, например, "Obama, Barack" (с двойными кавычками). Мне было интересно, можем ли мы что-то сделать, чтобы в таблицах это отображалось как Barack Obama. Я думаю, что мы можем сделать это с помощью объявления переменной, но просто не смогли найти решение.

И да, поскольку эта таблица содержит несколько транзакций одного и того же человека, мы также получаем несколько строк "Obama, Barack" ... концепция хранилища данных (таблицы фактов).

Ответы [ 2 ]

1 голос
/ 08 октября 2011

Из вопроса я предполагаю, что вы хотите:

  • Удалить кавычки
  • Удалить запятую
  • Поменяйте местами имена

Так что Regexp_replace, вероятно, ваш лучший выбор

UPDATE tablename
SET    column_name = REGEXP_REPLACE( column_name, '^"(\w+), (\w+)"$', '\2 \1' )

Итак, regexp_replace меняет значение столбца, если оно точно соответствует шаблону. Какие части выражения

  • ^" означает, что он должен начинаться с двойной кавычки
  • (\w+) означает, что сразу же следует строка из 1 или более буквенно-цифровых символов. Затем эта строка сохраняется в качестве переменной \1, поскольку ее первый набор ()
  • , означает сразу после запятой и пробел
  • (\w+) означает, что сразу же следует строка из 1 или более буквенно-цифровых символов. Затем эта строка сохраняется в качестве переменной \2, поскольку это второй набор ()
  • "$ означает, что сразу следует двойная кавычка, являющаяся концом строки
  • \2 \1 - строка замены, вторая сохраненная строка, за которой следует пробел, за которым следует первая сохраненная строка

Таким образом, все, что не соответствует этим условиям, не будет заменено. Поэтому, если у вас есть начальные или пробельные символы, или несколько пробелов после запятой, или по многим другим причинам текст не будет заменен.

Гораздо более гибкий (возможно, слишком гибкий) вариант может быть:

UPDATE tablename
SET    column_name = REGEXP_REPLACE( column_name, '^\W*(\w+)\W+(\w+)\W*$', '\2 \1' )

Это аналогично, но эффективно делает кавычки и запятую необязательными, и имеет дело с любой другой ведущей или конечной публикацией или пробелом.

  • ^\W* означает, что должен начинаться с ноль или более, не являющихся алфавитами
  • (\w+)\W+(\w+) означает две буквенно-цифровые строки, разделенные одной или несколькими не буквенно-цифровыми цифрами. Две строки сохраняются, как описано выше
  • \W*$ означает, что в этом случае должно заканчиваться ноль или более, не являющимися алфавитными числами

Подробнее о регулярном выражении в Oracle можно узнать здесь

1 голос
/ 08 октября 2011

То, что сказал @Ben, правильно. Правильно иметь два столбца: один для имени и один для фамилии.

Однако, если вы хотите обновить всю базу данных как есть, вы можете сделать ...

  /*This will swap the order round*/
  UPDATE TableName SET NameColumn = SUBSTRING(NameColumn, 1, CHARINDEX(',',NameColumn))+SUBSTRING(NameColumn, CHARINDEX(',', NameColumn),LEN(NameColumn)-CHARINDEX('"', NameColumn,2))

  /*This will remove the quotes*/
  UPDATE TableName SET NameColumn = REPLACE(NameColumn, '"', '')

Редактировать: - но поскольку я не вижу ваших данных, вам, возможно, придется немного их отредактировать. Но теория верна. Смотри здесь http://www.technoreader.com/SQL-Server-String-Functions.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...