Как разделить столбец на два столбца

У меня проблема с таблицей под названием «фильмы». Я обнаружил, что дата и название фильма указаны в колонке заголовков. Как показано на рисунке:

Как разделить столбец на два столбца

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

DataFrame(row.str.split(' ',-1).tolist(),columns = ['title','date'])

Как разделить его на две колонки (название, дата)?

Вы можете использовать STRING_SPLIT, если ваша версия SQLServer обновлена. Вы также можете использовать подстроку, если «дата» всегда является годом в скобках. К сожалению, я не думаю, что есть отличное решение. У вас не будет никакого эффективного использования индекса или UDF, которое я могу придумать для этой работы, и вам все равно придется что-то делать с вашими данными.

dylanthelion 07.04.2019 04:31

@dylanthelion Это не вопрос SQL Server, насколько я знаю.

Tim Biegeleisen 07.04.2019 05:06

@Tim Biegeleisen Верно!

Mohammad Alamri 07.04.2019 05:41
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
107
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы используете MySQL 8+, то мы можем попробовать использовать REGEXP_REPLACE:

SELECT
    REGEXP_REPLACE(title, '^(.*)\\s\\(.*$', '$1') AS title,
    REGEXP_REPLACE(title, '^.*\\s\\((\\d+)\\)$', '$1') AS date
FROM yourTable;

Демо

Вот общий шаблон регулярного выражения, который может соответствовать вашим строкам заголовков:

^.*\s\((\d+)\)$

Объяснение:

^            from the start of the string
    (.*)\s   match and capture anything, up to the last space
    \(       match a literal opening parenthesis
    (\d+)    match and capture the year (any number of digits)
    \)       match a literal closing parenthesis
$            end of string

Спасибо, Тим, этот отличный ответ работает хорошо. Не могли бы вы объяснить, как работает ('^(.*)\\s\(.*$') и (*\\s\\((\\d+)\\)$')? вещи.

Mohammad Alamri 07.04.2019 05:40

@MohammadAlamri Я добавил объяснение шаблона регулярного выражения. Если вы хотите исследовать регулярное выражение изолированно, я предлагаю использовать Регулярное выражение 101.

Tim Biegeleisen 07.04.2019 06:59

Я бы просто сделал:

select left(title, length(title) - 7) as title,
       replace(right(title, 5) ,')', '') as year

Регулярные выражения кажутся излишними для этой логики.

В Hive для этого нужно использовать substr():

select substr(title, 1, length(title) - 7) as title,
       substr(title, length(title) - 5, 4) as year

Ну, я пробовал, но это не сработало. даже я пытался внести некоторые изменения, но безрезультатно.

Mohammad Alamri 07.04.2019 08:19

У меня возникла проблема: «Ошибка при компиляции инструкции: FAILED: SemanticException Line 0:-1 Недопустимая функция« слева »»

Mohammad Alamri 07.04.2019 08:20

@МохаммадАламри . . . Ваш вопрос отмечен тегом MySQL, и эта функция определенно существует в MySQL. В Hive или MySQL вы можете использовать substr().

Gordon Linoff 07.04.2019 16:28

вы правы, вторая команда отлично работает после того, как я манипулировал числами. Лучший ответ. Спасибо

Mohammad Alamri 10.04.2019 02:27

@МохаммадАламри . . . Вы нашли проблему с этим ответом? Я заметил, что ты не принял это.

Gordon Linoff 28.10.2019 10:24

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

Mohammad Alamri 29.10.2019 08:19
Ответ принят как подходящий

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

select
   translate(substr(title,0,length(title) -6) ,'', '') as title,
   translate(substr(title, -5) ,')', '') as date
from movies;

Ответившим тоже спасибо!

Другие вопросы по теме