Mysq Запрос | Получить числа из строки в таблице

0

У меня есть таблица продуктов (продуктов) с записями:

id name
1  1969-1972 Chevrolet Small Block 
2  1971-1975 Chevrolet Small Block Fan Shroud
3  1964 Chevrolet Bumper Kit Complete
4  Chevrolet Clutch And Brake Pedal Assembly
...

Теперь я хочу, чтобы запрос заканчивал извлечение первых четырех чисел в качестве даты начала и символов от 6 до 9 в качестве даты окончания.

Таким образом, таблица результатов будет выглядеть так:

id name                                             start end
 1  1969-1972 Chevrolet Small Block                 1969  1972
 2  1971-1975 Chevrolet Small Block Fan Shroud      1971  1975
 3  1964 Chevrolet Bumper Kit Complete              1964  null
 4  Chevrolet Clutch And Brake Pedal Assembly       null  null     
 ...

Спасибо!

Теги:

2 ответа

1

Вы можете сделать запрос немного более надежным с некоторым согласованием REGEXP, например

SELECT id, 
  name,
  CASE WHEN name REGEXP '^[[:digit:]]{4}[ -]' THEN CAST(LEFT(name, 4) AS UNSIGNED)
  ELSE NULL
  END AS start,
  CASE WHEN name REGEXP '^[[:digit:]]{4}-[[:digit:]]{4} ' THEN CAST(SUBSTRING(name, 6, 4) AS UNSIGNED)
  ELSE NULL
  END AS end
FROM products

Выход:

id  name                                        start   end
1   1969-1972 Chevrolet Small Block             1969    1972
2   1971-1975 Chevrolet Small Block Fan Shroud  1971    1975
3   1964 Chevrolet Bumper Kit Complete          1964    (null)
4   Chevrolet Clutch And Brake Pedal Assembly   (null)  (null)

Или вы даже можете удалить дублируемую информацию года из имени, если хотите:

SELECT id, 
  CASE WHEN name REGEXP '^[[:digit:]]{4}-[[:digit:]]{4} ' THEN SUBSTRING(name, 10)
       WHEN name REGEXP '^[[:digit:]]{4} ' THEN SUBSTRING(name, 6)
       ELSE name 
  END AS name,
  CASE WHEN name REGEXP '^[[:digit:]]{4}[ -]' THEN CAST(LEFT(name, 4) AS UNSIGNED)
  ELSE NULL
  END AS start,
  CASE WHEN name REGEXP '^[[:digit:]]{4}-[[:digit:]]{4} ' THEN CAST(SUBSTRING(name, 6, 4) AS UNSIGNED)
  ELSE NULL
  END AS end
FROM products

Выход:

id  name                                        start   end
1   Chevrolet Small Block                       1969    1972
2   Chevrolet Small Block Fan Shroud            1971    1975
3   Chevrolet Bumper Kit Complete               1964    (null)
4   Chevrolet Clutch And Brake Pedal Assembly   (null)  (null)
1
 1. LEFT(name , 4) as start; 
 2. CAST(SUBSTRING(name, 6, 4) AS UNSIGNED) as end;
  • 1
    так ты сам нашел ответ? :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню