Простой способ создания столбца имени пули из столбца имени?

db_products Таблица:

| ID | Name         |
| 40 | Foo Bar!~~~~ |

Я хочу создать столбец имени пули:

| ID | Name         | Slug_Name |
| 40 | Foo Bar!~~~~ | foo-bar   |

Можно ли это на самом деле сделать с помощью SQL? Или мне нужно написать сценарий на другом языке?

РЕДАКТИРОВАТЬ: я генерирую слагов в PHP с помощью этой функции:

function toSlug($string,$space="-") {
    if (function_exists('iconv')) {
        $string = @iconv('UTF-8', 'ASCII//TRANSLIT', $string);
    }
    $string = preg_replace("/[^a-zA-Z0-9 -]/", "", $string);
    $string = strtolower($string);
    $string = str_replace(" ", $space, $string);
    return $string;
}

Пока что мои навыки работы с SQL довольно просты.

ALTER TABLE db_products ADD Slug_Name VARCHAR

Как мне пройти через каждый ряд и установить Slug_Name = toSlug(Name) а в SQL?

5 ответов

Решение

Вы можете, конечно, сделать замену строки, используя MySQL. Официальная документация перечисляет довольно много строковых функций, которые могут оказаться полезными.

SELECT REPLACE('Foo Bar!~~~~', '~', '');
SELECT LOWER('Foo Bar!');

Я также наткнулся на этот пост в блоге об использовании регулярных выражений в MySQL.

Обновлено: подробности из блога, который я упомянул:

Поэтому я бы порекомендовал создать функцию для замены регулярного выражения:

DELIMITER $$
FUNCTION `regex_replace`(pattern varchar(1000),replacement varchar(1000),original varchar(1000))
RETURNS varchar(1000)
DETERMINISTIC
BEGIN
DECLARE temp VARCHAR(1000);
DECLARE ch VARCHAR(1);
DECLARE i INT;
SET i = 1;
SET temp =”;
IF original REGEXP pattern THEN
    loop_label: LOOP
    IF i>CHAR_LENGTH(original) THEN
        LEAVE loop_label;
    END IF;
    SET ch = SUBSTRING(original,i,1);
    IF NOT ch REGEXP pattern THEN
        SET temp = CONCAT(temp,ch);
    ELSE
        SET temp = CONCAT(temp,replacement);
    END IF;
    SET i=i+1;
END LOOP;
END IF;
RETURN temp;
END$$
DELIMITER ;

Тогда что-то похожее на следующее

SELECT regex_replace(‘[^a-zA-Z0-9]+‘, ”, “%$&?/’|test><+-,][)(" )

Если вам не нравится такой подход, вы всегда можете просто выполнить некоторые вызовы обновления, используя замену

update db_products set Slug_Name = replace(Name, '~', '');

Вот простое решение с одним запросом:

UPDATE `my_table` SET alias = lower(name),
alias = replace(alias, '.', ' '),
alias = replace(alias, '\'', '-'),
alias = replace(alias,'š','s'),
alias = replace(alias,'Ð','Dj'),
alias = replace(alias,'ž','z'),
alias = replace(alias,'Þ','B'),
alias = replace(alias,'ß','Ss'),
alias = replace(alias,'à','a'),
alias = replace(alias,'á','a'),
alias = replace(alias,'â','a'),
alias = replace(alias,'ã','a'),
alias = replace(alias,'ä','a'),
alias = replace(alias,'å','a'),
alias = replace(alias,'æ','a'),
alias = replace(alias,'ç','c'),
alias = replace(alias,'è','e'),
alias = replace(alias,'é','e'),
alias = replace(alias,'ê','e'),
alias = replace(alias,'ë','e'),
alias = replace(alias,'ì','i'),
alias = replace(alias,'í','i'),
alias = replace(alias,'î','i'),
alias = replace(alias,'ï','i'),
alias = replace(alias,'ð','o'),
alias = replace(alias,'ñ','n'),
alias = replace(alias,'ò','o'),
alias = replace(alias,'ó','o'),
alias = replace(alias,'ô','o'),
alias = replace(alias,'õ','o'),
alias = replace(alias,'ö','o'),
alias = replace(alias,'ø','o'),
alias = replace(alias,'ù','u'),
alias = replace(alias,'ú','u'),
alias = replace(alias,'û','u'),
alias = replace(alias,'ý','y'),
alias = replace(alias,'ý','y'),
alias = replace(alias,'þ','b'),
alias = replace(alias,'ÿ','y'),
alias = replace(alias,'ƒ','f'),
alias = replace(alias, 'œ', 'oe'),
alias = replace(alias, '€', 'euro'),
alias = replace(alias, '$', 'dollars'),
alias = replace(alias, '£', ''),
alias = trim(alias),
alias = replace(alias, ' ', '-'),
alias = replace(alias, '--', '-') ;

В этом примере:

  • "my_table" - это имя таблицы,
  • 'name' - оригинальное поле
  • "псевдоним" - это название моего слаг-поля

Надеюсь, поможет!

Измените ваше имя tbl_ и field_name и slug _field_name

SELECT field_name,
 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
 LOWER(TRIM(field_name)), ':', ''), ')', ''), '(', ''), ',', ''), '\\', ''), '\/', ''), '\"', ''), '?', ''), '\'', ''), '&', ''), '!', ''), '.', ''), ' ', '-'), '--', '-'), '--', '-')
AS `slug_field_name`
FROM tbl_name

Для теста ' Your String ' приведите your-string:

SELECT
 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
 LOWER(TRIM('Your String')), ':', ''), ')', ''), '(', ''), ',', ''), '\\', ''), '\/', ''), '\"', ''), '?', ''), '\'', ''), '&', ''), '!', ''), '.', ''), ' ', '-'), '--', '-'), '--', '-')
AS `slug_test`

Для специальных символов:

Добавьте [REPLACE(] и [, ':', '')]

Например, символ ö в этой строке " Привет, Шелен Вельт "

Результат " алло-шон-вельт "

SELECT
 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
 REPLACE(
 LOWER(TRIM('Hallo schöne Welt')), 'ö', 'o'), ':', ''), ')', ''), '(', ''), ',', ''), '\\', ''), '\/', ''), '\"', ''), '?', ''), '\'', ''), '&', ''), '!', ''), '.', ''), ' ', '-'), '--', '-'), '--', '-')
AS `slug_test`

Я внес некоторые изменения в ответ Эрвана Дюпё-Мэра, чтобы объяснить некоторые недостающие символы, которые у меня были в моем name поле: ',', '&' и '/'

UPDATE `table` SET slug = lower(name),
slug = replace(slug, '.', ''),
slug = replace(slug, '\'', '-'),
slug = replace(slug, '/', '-'),
slug = replace(slug,'š','s'),
slug = replace(slug,'Ð','Dj'),
slug = replace(slug,'ž','z'),
slug = replace(slug,'Þ','B'),
slug = replace(slug,'ß','Ss'),
slug = replace(slug,'à','a'),
slug = replace(slug,'á','a'),
slug = replace(slug,'â','a'),
slug = replace(slug,'ã','a'),
slug = replace(slug,'ä','a'),
slug = replace(slug,'å','a'),
slug = replace(slug,'æ','a'),
slug = replace(slug,'ç','c'),
slug = replace(slug,'è','e'),
slug = replace(slug,'é','e'),
slug = replace(slug,'ê','e'),
slug = replace(slug,'ë','e'),
slug = replace(slug,'ì','i'),
slug = replace(slug,'í','i'),
slug = replace(slug,'î','i'),
slug = replace(slug,'ï','i'),
slug = replace(slug,'ð','o'),
slug = replace(slug,'ñ','n'),
slug = replace(slug,'ò','o'),
slug = replace(slug,'ó','o'),
slug = replace(slug,'ô','o'),
slug = replace(slug,'õ','o'),
slug = replace(slug,'ö','o'),
slug = replace(slug,'ø','o'),
slug = replace(slug,'ù','u'),
slug = replace(slug,'ú','u'),
slug = replace(slug,'û','u'),
slug = replace(slug,'ý','y'),
slug = replace(slug,'ý','y'),
slug = replace(slug,'þ','b'),
slug = replace(slug,'ÿ','y'),
slug = replace(slug,'ƒ','f'),
slug = replace(slug, 'œ', 'oe'),
slug = replace(slug, '€', 'euro'),
slug = replace(slug, '$', 'dollars'),
slug = replace(slug, '£', ''),
slug = trim(slug),
slug = replace(slug, ',', ''),
slug = replace(slug, '&', ''),
slug = replace(slug, ' ', '-'),
slug = replace(slug, '--', '-');

Вот простой и быстрый способ создания пула из поля имени :

      UPDATE store_book SET
    slug = lower(title),
    slug = replace(slug, '.', ' '),
    slug = replace(slug, ',', ' '),
    slug = replace(slug, ';', ' '),
    slug = replace(slug, ':', ' '),
    slug = replace(slug, '?', ' '),
    slug = replace(slug, '%', ' '),
    slug = replace(slug, '$', ' '),
    slug = replace(slug, '&', ' '),
    slug = replace(slug, '#', ' '),
    slug = replace(slug, '*', ' '),
    slug = replace(slug, '!', ' '),
    slug = replace(slug, '_', ' '),
    slug = replace(slug, '@', ' '),
    slug = replace(slug, '+', ' '),
    slug = replace(slug, '(', ' '),
    slug = replace(slug, ')', ' '),
    slug = replace(slug, '[', ' '),
    slug = replace(slug, ']', ' '),
    slug = replace(slug, '/', ' '),
    slug = replace(slug, '-', ' '),
    slug = replace(slug, '\'', ''),
    slug = trim(slug),
    slug = replace(slug, ' ', '-'),
    slug = replace(slug, '--', '-'),
    slug=replace(slug, 'ä', 'a'),
    slug=replace(slug, 'å', 'a'),
    slug=replace(slug, 'æ', 'a'),
    slug=replace(slug, 'ç', 'c'),
    slug=replace(slug, 'è', 'e'),
    slug=replace(slug, 'é', 'e'),
    slug=replace(slug, 'ê', 'e'),
    slug=replace(slug, 'ë', 'e'),
    slug=replace(slug, 'ì', 'i'),
    slug=replace(slug, 'í', 'i'),
    slug=replace(slug, 'î', 'i'),
    slug=replace(slug, 'ï', 'i'),
    slug=replace(slug, 'ð', 'o'),
    slug=replace(slug, 'ñ', 'n'),
    slug=replace(slug, 'ò', 'o'),
    slug=replace(slug, 'ó', 'o'),
    slug=replace(slug, 'ô', 'o'),
    slug=replace(slug, 'õ', 'o'),
    slug=replace(slug, 'ö', 'o'),
    slug=replace(slug, 'ø', 'o'),
    slug = replace(slug, 'ù','u'),
    slug = replace(slug, 'ú','u'),
    slug = replace(slug, 'û','u'),
    slug = replace(slug, 'ü','u'),
    slug = replace(slug, 'ý','y'),
    slug = replace(slug, 'ë','e'),
    slug = replace(slug, 'à','a'),
    slug = replace(slug, 'á','a'),
    slug = replace(slug, 'â','a'),
    slug = replace(slug, 'ã','a'),
    slug= replace(slug, '%', ''),
    slug= replace(slug, 'ç', 'c'),
    slug= replace(slug, 'ü', 'u'),
    slug= replace(slug, 'ğ', 'g'),
    slug= replace(slug, 'ş', 's'),
    slug= replace(slug, 'ß', 'b'),
    slug= replace(slug, 'ı', 'i'),
    slug= replace(slug, '.', ''),
    slug= replace(slug, 'ö', 'ö'),
    slug= replace(slug, 'ç', 'c'),
    slug= replace(slug, '#x27;', ''),
    slug = replace(slug, '--', '-');

в конце вы можете использовать приведенный ниже запрос для проверки поля пули

      SELECT * FROM store_book WHERE
    slug NOT RLIKE '^([a-z0-9]+\-)*[a-z0-9]+$';

Обратите внимание, что ваше последнее утверждение должно быть

      slug = replace(slug, '--', '-')

но вы можете добавить другие символы перед этой строкой. Чтобы найти то, что вам нужно добавить, вы можете использовать приведенный выше запрос проверки. Если он возвращает какие-либо строки, это означает, что есть какой-либо символ, который не поддерживается в пуле.

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