У меня есть таблица продуктов (продуктов) с записями:
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
...
Спасибо!
Вы можете сделать запрос немного более надежным с некоторым согласованием 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. LEFT(name , 4) as start;
2. CAST(SUBSTRING(name, 6, 4) AS UNSIGNED) as end;