Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

สร้างฟังก์ชัน MySQL ทำตรงข้าม INITCAP (ตัวแรกพิมพ์เล็ก ตัวอื่นพิมพ์ใหญ่)

Custom Function: Anti-INITCAP

INITCAP() (Oracle/PostgreSQL) ทำให้ตัวแรกของแต่ละคำเป็นพิมพ์ใหญ่ ที่เหลือพิมพ์เล็ก MySQL ไม่มี Built-in แต่สามารถสร้าง Function เองได้

ฟังก์ชัน Anti-INITCAP: ตัวแรกพิมพ์เล็ก, ตัวอื่นพิมพ์ใหญ่

DELIMITER //
CREATE FUNCTION convertFirstLetterToLowerAndRemainingToCapital(input_str VARCHAR(250))
RETURNS VARCHAR(250)
DETERMINISTIC
BEGIN
    DECLARE str_len INT;
    DECLARE i INT;
    DECLARE result_str VARCHAR(250);
    
    SET str_len = CHAR_LENGTH(input_str);
    SET result_str = UPPER(input_str);  -- ทำให้ทั้งหมดเป็นพิมพ์ใหญ่ก่อน
    SET i = 0;
    
    WHILE (i < str_len) DO
        -- ถ้าตัวก่อนเป็น Space หรือเป็นตัวแรกของสตริง -> ทำให้ตัวนี้เป็นพิมพ์เล็ก
        IF (MID(result_str, i, 1) = ' ' OR i = 0) THEN
            IF (i < str_len) THEN
                SET result_str = CONCAT(
                    LEFT(result_str, i),
                    LOWER(MID(result_str, i + 1, 1)),
                    RIGHT(result_str, str_len - i - 1)
                );
            END IF;
        END IF;
        SET i = i + 1;
    END WHILE;
    
    RETURN result_str;
END //
DELIMITER ;

การทดสอบ

SELECT convertFirstLetterToLowerAndRemainingToCapital('Introduction To MySQL');

ผลลัพธ์: iNTRODUCTION tO mYSQL

ฟังก์ชัน INITCAP แบบ MySQL (ตัวแรกพิมพ์ใหญ่ ที่เหลือพิมพ์เล็ก)

CREATE FUNCTION initcap_mysql(input_str VARCHAR(250))
RETURNS VARCHAR(250)
DETERMINISTIC
BEGIN
    DECLARE str_len INT;
    DECLARE i INT;
    DECLARE result_str VARCHAR(250);
    DECLARE prev_char CHAR(1);
    
    SET str_len = CHAR_LENGTH(input_str);
    SET result_str = LOWER(input_str);  -- ทำให้ทั้งหมดเป็นพิมพ์เล็กก่อน
    SET i = 1;
    SET prev_char = ' ';  -- สมมติตัวก่อนหน้าตัวแรกเป็น Space
    
    WHILE (i <= str_len) DO
        -- ถ้าตัวก่อนเป็น Space หรือตัวแรก -> ทำให้ตัวนี้เป็นพิมพ์ใหญ่
        IF (prev_char = ' ' OR i = 1) THEN
            SET result_str = CONCAT(
                LEFT(result_str, i - 1),
                UPPER(MID(result_str, i, 1)),
                RIGHT(result_str, str_len - i)
            );
        END IF;
        SET prev_char = MID(result_str, i, 1);
        SET i = i + 1;
    END WHILE;
    
    RETURN result_str;
END;

การทดสอบ INITCAP

SELECT initcap_mysql('hello world mysql');

ผลลัพธ์: Hello World Mysql

ข้อควรระวังเรื่อง Performance

  • User-Defined Function (UDF) ใน MySQL ช้า เรียกต่อ Row
  • ไม่ควรใช้ใน WHERE Clause หรือ JOIN Condition บนตารางใหญ่
  • แนะนำใช้ใน SELECT List เท่านั้น หรือคำนวณใน Application Layer
  • MySQL 8.0+ ใช้ REGEXP_REPLACE ไม่ได้ (ต้อง MariaDB 10.0.5+)

Alternative: คำนวณใน Application (PHP/Python/Node.js)

-- PHP
function initcap($str) {
    return ucwords(strtolower($str));
}
function anti_initcap($str) {
    return lcfirst(ucwords(strtolower($str)));  // หรือ logic ตามต้องการ
}