mysql - स्ट्रिंग को अलग कैसे करें और इसे पुन:बनाएँ




list loops (3)

स्ट्रिंग सूची को अलग करना और mysql में नए मानों के साथ एक ही सूची को बदलने से मैंने अपनी तालिका 1 टेबल टेबल में डेटा का पालन किया है (वर्तमान में सहेजे गए ढांचे)

code        value
12_A        ["A","B","C","D"]  
12_B        ["E","F","G","H"]
12_3        ["I","J","K","L"]

लेकिन प्रत्येक कोड में अलग-अलग विवरण होते हैं। पसंद::

code    value     description
12_A    A         Apple
12_A    B         Ball
12_A    C         Cat
12_A    D         Dog
12_B    E         Eagle
12_B    F         Flag
.       .         .
.       .         . 
.       .         .

मुझे तालिका 1 से मूल्य सूची को अलग करना होगा और उसी तालिका में फिर से सहेजने की आवश्यकता है अर्थात तालिका_1 (इस संरचना में) ::

code            value
12_A            ["Apple","Ball","Cat","Dog"]
12_B            ["Eagle","Flag",.......]
12_3            [......................] 

Answers

आप GROUP_CONCAT() उपयोग कर सकते हैं:

UPDATE Table1 s
SET s.value = (SELECT t.code,CONCAT('["',
                           GROUP_CONCAT(t.description ORDER BY t.description SEPARATOR '","'),
                           ']') 
             FROM Table_With_val t
             WHERE t.code = s.code
               AND s.value LIKE CONCAT('%"',t.value,'"%'))

आपने कोई निर्णायक जानकारी प्रदान नहीं की, मैंने आपके द्वारा प्रदान किया गया दूसरा डेटा नमूना मान लिया है कि वह एक मौजूदा तालिका है, और तालिका 1 वह तालिका है जिसे आप अपडेट करना चाहते हैं

नोट: यह एक खराब डीबी संरचना है! यह भविष्य में विशेष रूप से समस्या पैदा कर सकता है, खासकर तब जब इसमें शामिल होने की आवश्यकता हो। मैं दृढ़ता से आपको अपने डेटा को सामान्य करने और अपने स्वयं के रिकॉर्ड में प्रत्येक विवरण और मूल्य को संग्रहीत करने की सलाह देता है।


आप एक ऐसा समारोह बना सकते हैं जिसमें आप अपनी स्ट्रिंग सूची को अपने उदाहरण के मामले में पैरामीटर के रूप में पास कर सकते हैं ["ए", "बी", "सी", "डी"] पैरामीटर होगा फ़ंक्शन स्ट्रिंग को तोड़ देगा और इसके अनुसार विवरण जोड़ देगा। आप उपयोग कर सकते हैं फ़ंक्शन का उदाहरण नीचे दिया गया है:

DELIMITER $$

DROP FUNCTION IF EXISTS codeToDesc$$

CREATE FUNCTION codeToDesc(commaSeperatedCodeList TEXT) RETURNS TEXT CHARSET utf8
BEGIN
DECLARE finalString TEXT;
DECLARE inputCodeList TEXT;
DECLARE codeName VARCHAR(255);
DECLARE codecount BIGINT(5);

SET finalString='';
SET inputCodeList = REPLACE(REPLACE(REPLACE(commaSeperatedCodeList,'[',''),']',''),'"','');

DROP TEMPORARY TABLE IF EXISTS test.code_table;
DROP TEMPORARY TABLE IF EXISTS test.code_count;
CREATE TEMPORARY TABLE test.code_table (CODE VARCHAR(255));
CREATE TEMPORARY TABLE test.code_count (countNo BIGINT(11));

INSERT INTO test.code_count(countNo) SELECT(LENGTH(inputCodeList)-LENGTH(REPLACE(inputCodeList,',','')) + 1);

BEGIN

    DECLARE table_cursor CURSOR FOR SELECT countNo FROM test.code_count;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET codecount = (SELECT countNo FROM test.code_count ORDER BY countNo ASC LIMIT 1);

    OPEN table_cursor;
    readLoop1: LOOP

    FETCH table_cursor INTO codecount;  

        IF codecount=0 THEN
              LEAVE readLoop1;
        END IF; 

    SET codeName=(SELECT SUBSTRING_INDEX(inputCodeList,',',1)); 
    INSERT INTO test.code_table(CODE) SELECT codeName;
    SET inputCodeList=(SELECT TRIM(BOTH ',' FROM REPLACE(inputCodeList,codeName,'')));  
    INSERT INTO test.code_count(countNo) SELECT codecount-1;    
    SET codeName='';

    END LOOP;
    CLOSE table_cursor;
END;    

    -- use your code and description here, i guess those should be fixed
    SELECT CONCAT('["',REPLACE(GROUP_CONCAT(CASE WHEN CODE='A' THEN 'Apple'
               WHEN CODE = 'B' THEN 'Ball'
               WHEN CODE = 'C' THEN 'Cat'
               WHEN CODE = 'D' THEN 'Dog'
               ELSE '' END),',','","'),'"]') INTO finalString FROM test.code_table;

    RETURN finalString; 

END$$

DELIMITER ;

यह कोशिश करो, मुझे बताएं कि क्या आपको कोई समस्या हुई है।


सभी जेसन तार '{' या '[' 'के साथ शुरू होते हैं और संबंधित'} 'या'] 'के साथ समाप्त होते हैं, इसलिए बस इसकी जांच करें।

यहां बताया गया है कि Angular.js यह कैसे करता है:

var JSON_START = /^\[|^\{(?!\{)/;
var JSON_ENDS = {
  '[': /]$/,
  '{': /}$/
};

function isJsonLike(str) {
    var jsonStart = str.match(JSON_START);
    return jsonStart && JSON_ENDS[jsonStart[0]].test(str);
}

https://github.com/angular/angular.js/blob/v1.6.x/src/ng/http.js





mysql sql list loops