2013-04-17 17 views
5

db_products tavolo:Un modo semplice per generare una colonna del nome slug dalla colonna del nome?

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

voglio generare una colonna Nome slug:

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

può questo essere effettivamente fatto tramite SQL? O dovrei scrivere uno script usando una lingua diversa?

EDIT: sto generando lumache in PHP utilizzando questa funzione:

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; 
} 

Finora le mie competenze SQL abbastanza semplice.

ALTER TABLE db_products ADD Slug_Name VARCHAR

Come faccio a ciclo attraverso ogni riga e impostare Slug_Name = toSlug(Name) ma in SQL?

+1

Cosa hanno hai provato fino ad ora? MySQL ha diverse funzioni di manipolazione delle stringhe. Potresti voler sostituire replace(), lower(), trim() e regexp() in modo specifico. – Jrod

risposta

2

È possibile eseguire una sostituzione di stringa utilizzando MySQL. Lo official documentation elenca alcune funzioni di stringa che potresti trovare utili.

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

ho anche eseguito attraverso questo blog post sull'utilizzo di espressioni regolari in MySQL.

Aggiornato: Dettagli dal post ho accennato:

Allora, cosa mi sento di raccomandare è la creazione di una funzione per fare un'espressione regolare sostituzione:

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 ; 

Poi qualcosa di simile al seguente

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

Se non ti senti a tuo agio con questo approccio, puoi sempre eseguire alcune chiamate di aggiornamento utilizzando

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

Combinato con 'TRIGGER' questo potrebbe essere molto efficace.Non ne ho mai usato uno, ma sembra che dovrebbe essere qualcosa come 'CREATE TRIGGER PRIMA DI INSERIRE PER OGNI SET DI RIGA new.slug = COOL_REPLACE_FUNCTION (new.title);' – Aufziehvogel

+0

@Moch Ho modificato la mia domanda per riflettere chiaramente il mio problema. – meiryo

+0

Quindi, aiutami a capire cosa stai chiedendo. Hai quello che sembra una soluzione perfettamente buona in PHP. Stai aggiornando le righe già nel tuo database? –

7

Ecco una soluzione semplice con una singola query:

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, '--', '-') ; 

In questo esempio:

  • 'my_table' è il nome della tabella,
  • 'nome' è il campo originale
  • "alias" è il nome del mio campo di lumaca

Spero che aiuti!

+1

Errore sulla linea 5, manca una virgola alla fine. – Slam

1

ho fatto alcune modifiche alla risposta di Erwan Dupeux-Maire, per tenere conto di alcuni caratteri mancanti, che ho avuto nella mia name campo: ' '' &', e '/'

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, '--', '-'); 
Problemi correlati