MySQL में कस्टम फ़ंक्शन बनाकर INITCAP() के विपरीत कार्यक्षमता लागू करना
MySQL में बिल्ट-इन INITCAP() फ़ंक्शन नहीं है (यह Oracle का है), लेकिन इसका उल्टा - प्रत्येक शब्द का पहला अक्षर लोअरकेस और बाकी अपरकेस - कस्टम फ़ंक्शन बनाकर लागू किया जा सकता है।
कस्टम फ़ंक्शन बनाना
mysql> DELIMITER //
mysql> CREATE FUNCTION convertFirstLetterToLowerAndRemainingToCapital(value VARCHAR(250))
RETURNS VARCHAR(250)
DETERMINISTIC
BEGIN
DECLARE valueLength INT;
DECLARE l INT;
SET valueLength = CHAR_LENGTH(value);
SET value = UPPER(value);
SET l = 0;
WHILE (l < valueLength) DO
IF (MID(value, l, 1) = ' ' OR l = 0) THEN
IF (l < valueLength) THEN
SET value = CONCAT(
LEFT(value, l),
LOWER(MID(value, l + 1, 1)),
RIGHT(value, valueLength - l - 1)
);
END IF;
END IF;
SET l = l + 1;
END WHILE;
RETURN value;
END //
mysql> DELIMITER ;
फ़ंक्शन कॉल करना
mysql> SELECT convertFirstLetterToLowerAndRemainingToCapital('Introduction To MySQL');
आउटपुट:
+-------------------------------------------------------------------------+
| convertFirstLetterToLowerAndRemainingToCapital('Introduction To MySQL') |
+-------------------------------------------------------------------------+
| iNTRODUCTION tO mYSQL |
+-------------------------------------------------------------------------+
1 row in set, 2 warnings (0.04 sec)
एल्गोरिदम व्याख्या:
- पूरे स्ट्रिंग को
UPPER()से अपरकेस में बदलें - प्रत्येक वर्ण पर लूप करें
- जब स्पेस मिले या शुरुआत (l=0) हो, तो अगले वर्ण को
LOWER()करें CONCAT(),LEFT(),MID(),RIGHT()से स्ट्रिंग पुनर्निर्माण करें
सरल विकल्प (MySQL 8.0+):
रेगुलर एक्सप्रेशन के साथ (यदि उपलब्ध हो):
SELECT REGEXP_REPLACE(UPPER('Introduction To MySQL'), '(^| )([A-Z])', '\\1\\2');
लेकिन कस्टम फ़ंक्शन सभी MySQL संस्करणों पर काम करता है।
चेतावनी:
आउटपुट में "2 warnings" दिखाई दिए क्योंकि लूप में स्ट्रिंग संशोधन के दौरान लंबाई बदल सकती है। उत्पादन कोड में लंबाई को स्थिर रखें या अलग दृष्टिकोण उपयोग करें।
बेहतर कार्यान्वयन (सुधारित):
CREATE FUNCTION invert_initcap(str VARCHAR(250))
RETURNS VARCHAR(250)
DETERMINISTIC
BEGIN
DECLARE result VARCHAR(250) DEFAULT '';
DECLARE word VARCHAR(250);
DECLARE i INT DEFAULT 1;
DECLARE len INT DEFAULT CHAR_LENGTH(str);
DECLARE in_word BOOLEAN DEFAULT FALSE;
WHILE i <= len DO
IF MID(str, i, 1) = ' ' THEN
SET result = CONCAT(result, ' ');
SET in_word = FALSE;
ELSE
IF NOT in_word THEN
SET result = CONCAT(result, LOWER(MID(str, i, 1)));
SET in_word = TRUE;
ELSE
SET result = CONCAT(result, UPPER(MID(str, i, 1)));
END IF;
END IF;
SET i = i + 1;
END WHILE;
RETURN result;
END