Fungsi Title Case pada MySql

Suatu hari, ketika saya melakukan sebuah query pada database MySQL, tampak di mata saya bahwa sebuah kolom (baca: field), sebut saja kolom ‘nama’, berisi nama-nama yang tertulis dengan huruf yang tidak seragam. Ada yang tertulis huruf besar semua, ada juga yang kecil semua. Ada juga yang campuran. Terbersit di pikiran saya, bagaimana agar output queri saya ini bisa rapi. Oh, andai saja ada fungsi built in untuk membuatnya menjadi title-case (setiap kata diawali dengan huruf kapital)…

Satu-satunya jalan adalah dengan menggunakan fungsi yang bisa didefinisikan sendiri oleh pengguna. Dan, alhamdulillah saya dipertemukan dengan laman ini http://stackoverflow.com/questions/1191605/is-there-a-simple-way-to-convert-mysql-data-into-title-case. Berikut adalah cerita selengkapnya..

Pertama, buatlah fungsi dengan nama lowerword dengan kode sintaks sebagai berikut:

DROP FUNCTION IF EXISTS lowerword;
SET GLOBAL  log_bin_trust_function_creators=TRUE; 
DELIMITER |
CREATE FUNCTION lowerword( str VARCHAR(128), word VARCHAR(5) )
RETURNS VARCHAR(128)
BEGIN
  DECLARE i INT DEFAULT 1;
  DECLARE loc INT;

  SET loc = LOCATE(CONCAT(word,' '), str, 2);
  IF loc > 1 THEN
    WHILE i <= LENGTH (str) AND loc <> 0 DO
      SET str = INSERT(str,loc,LENGTH(word),LCASE(word));
      SET i = loc+LENGTH(word);
      SET loc = LOCATE(CONCAT(word,' '), str, i);
    END WHILE;
  END IF;
  RETURN str;
END;
|
DELIMITER ;

Selanjutnya, buatlah fungsi dengan nama tcase dengan kode sebagai berikut:

DROP FUNCTION IF EXISTS tcase; 
SET GLOBAL  log_bin_trust_function_creators=TRUE; 
DELIMITER | 
CREATE FUNCTION tcase( str VARCHAR(128) ) 
RETURNS VARCHAR(128) 
BEGIN 
  DECLARE c CHAR(1); 
  DECLARE s VARCHAR(128); 
  DECLARE i INT DEFAULT 1; 
  DECLARE bool INT DEFAULT 1; 
  DECLARE punct CHAR(17) DEFAULT ' ()[]{},.-_!@;:?/'; 
  SET s = LCASE( str ); 
  WHILE i <= LENGTH( str ) DO
    BEGIN 
      SET c = SUBSTRING( s, i, 1 ); 
      IF LOCATE( c, punct ) > 0 THEN 
        SET bool = 1; 
      ELSEIF bool=1 THEN  
        BEGIN 
          IF c >= 'a' AND c <= 'z' THEN  
            BEGIN 
              SET s = CONCAT(LEFT(s,i-1),UCASE(c),SUBSTRING(s,i+1)); 
              SET bool = 0; 
            END; 
          ELSEIF c >= '0' AND c <= '9' THEN 
            SET bool = 0; 
          END IF; 
        END; 
      END IF; 
      SET i = i+1; 
    END; 
  END WHILE;

  SET s = lowerword(s, 'A');
  SET s = lowerword(s, 'An');
  SET s = lowerword(s, 'And');
  SET s = lowerword(s, 'As');
  SET s = lowerword(s, 'At');
  SET s = lowerword(s, 'But');
  SET s = lowerword(s, 'By');
  SET s = lowerword(s, 'For');
  SET s = lowerword(s, 'If');
  SET s = lowerword(s, 'In');
  SET s = lowerword(s, 'Of');
  SET s = lowerword(s, 'On');
  SET s = lowerword(s, 'Or');
  SET s = lowerword(s, 'The');
  SET s = lowerword(s, 'To');
  SET s = lowerword(s, 'Via');

  RETURN s; 
END; 
| 
DELIMITER ;

Pastikan untuk menjalankan sintaks di atas secara berurut, yakni fungsi lowerword terlebih dahulu baru kemudian fungsi tcase.

Jika fungsi telah terbentuk, silakan panggil melalui kueri, seperti:

SELECT tcase(title) FROM table;

Atau bisa juga kita gunakan untuk memperbaiki data kita, melalui perintah ‘UPDATE’ seperti berikut:

UPDATE table SET title = tcase(title);

Semua kode di atas sudah saya gunakan, dan terbukti berhasil.

Pos ini dipublikasikan di Developer dan tag , , , . Tandai permalink.

Satu Balasan ke Fungsi Title Case pada MySql

  1. abah berkata:

    Terimakasih, sangat membantu..

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s