Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MySQL

MySQL में INITCAP() के विपरीत कार्यक्षमता कैसे लागू करें?

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)

एल्गोरिदम व्याख्या:

  1. पूरे स्ट्रिंग को UPPER() से अपरकेस में बदलें
  2. प्रत्येक वर्ण पर लूप करें
  3. जब स्पेस मिले या शुरुआत (l=0) हो, तो अगले वर्ण को LOWER() करें
  4. 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
  1. - MySQL में महीने के अनुसार टेबल में मानों का योग कैसे करें

    EXTRACT(MONTH FROM ...) और GROUP BY के साथ मासिक योग इसके लिए EXTRACT() का उपयोग करें, जो विशिष्ट महीने के रिकॉर्ड निकालने की अनुमति देता है। उदाहरण के लिए, जनवरी में सभी कीमतों को जोड़ना (वर्ष की परवाह किए बिना)। पहले टेबल बनाएं: create table DemoTable1415 ( ProductPurchaseDate date, ProductPrice

  1. - MySQL में DATE_ADD से तारीख में वर्ष जोड़ें

    UPDATE और DATE_ADD() से मौजूदा तारीखों में अंतराल जोड़ें मौजूदा तारीख कॉलम में वर्ष (या अन्य अंतराल) जोड़ने के लिए UPDATE के साथ DATE_ADD() का उपयोग करें। टेबल बनाएं और डेटा डालें: mysql> create table DemoTable1984 ( ShippingDate date ); Query OK, 0 rows affected (0.00 sec) mysql> insert into

  1. - MySQL में ORDER BY से विशिष्ट मान को अंत में कैसे सॉर्ट करें?

    ट्रिक: बूलियन अभिव्यक्ति सॉर्टिंग (full_name=Not Known) TRUE=1, FALSE=0 देता है। ASC क्रम में 0 पहले, 1 बाद में आता है। उदाहरण insert into demo57(full_name) values(John Smith), (David Miller), (Not Known), (Chris Brown); क्वेरी select * from demo57 order by (full_name=Not Known), full_name desc