2015-12-17 11 views
6

मैं उपनाम के रूप में एक कस्टम कॉलम दिखाना चाहता हूं लेकिन ऑटो कैरेक्टर का उपयोग करके वृद्धि करने की आवश्यकता है।स्वत: वृद्धि वर्णों के साथ कस्टम कॉलम कैसे बनाएं

id  subid dollar packetname 
168  355  5813 ND-1 
169  355  359  ND-1 
170  356  559  ND-2 
171  362  4536 ND-10 
172  362  484  ND-10 
134  329  4698 ND-12 
135  329  435  ND-12 
125  330  6293 ND-13 
126  330  4293 ND-13 
127  330  693  ND-13 

मैं एक अद्यतन पैकेट के साथ एक उत्पादन की जरूरत है। autoincrement चरित्र के साथ स्तंभ

id  subid dollar packetname  updated packet 
168  355  5813 ND-1   ND-1 
169  355  359  ND-1   ND-1A 
170  356  559  ND-2   ND-2 
171  362  4536 ND-10   ND-10 
172  362  484  ND-10   ND-10A 
134  329  4698 ND-12   ND-12 
135  329  435  ND-12   ND-12A 
125  330  6293 ND-13   ND-13 
126  330  4293 ND-13   ND-13A 
127  330  693  ND-13   ND-13B 
+2

हम्म, क्या आप 38 वीं होने की अपेक्षा करेंगे लगता है, 37 वें स्तंभ 'एन डी 13Z' हो जाएगा? – Timekiller

+0

@ टिमकिल्लर नहीं, मुझे 38 वें स्थान पर कुछ भी उम्मीद नहीं है। मेरी अधिकतम आवश्यकता केवल ए से जी है। –

उत्तर

2

आप इस तरह के प्रश्न का उपयोग कर सकते अतिरिक्त क्षेत्र

बनाने के लिए
SELECT concat(packetname, 
       elt(if(@t=packetname, @n:[email protected]+1, @n:=1), 
        '','A','B','C','D','E','F','G')) `updated packet`, 
     id, subid, dollar, @t:=packetname packetname 
    FROM t 
     cross join 
     (SELECT @n:=1, @t:="") n 
    order by packetname 

demo on sqlfiddle

2

मुझे लगता है कि आपका सर्वश्रेष्ठ दांव, बाहर वर्तमान पैकेट तालिका SELECT है रास्ते में इसे संशोधित करने, और INSERT यह एक नई तालिका में। एक बार जब आप इस ऑपरेशन को पूरा कर लेते हैं, तो आप मूल तालिका को छोड़ सकते हैं, और फिर नए को एक पुराने नाम का नाम बदल सकते हैं।

INSERT INTO newpacket (id, subid, dollar, packetname, `updated packet`) 
SELECT p1.id, p1.subid, p1.dollar, p1.packetname, p2.`updated packet` 
FROM packet p1 
INNER JOIN 
(
    SELECT p.id, p.subid, 
     CASE WHEN (SELECT p.id - MIN(t.id) FROM packet t WHERE t.subid = p.subid) > 0 
     THEN CONCAT(packetname, 
        CHAR(((SELECT p.id - MIN(t.id) FROM packet t WHERE t.subid = p.subid) + 64) USING utf8)) 
     ELSE packetname END AS `updated packet` 
    FROM packet p 
) p2 
ON p1.subid = p2.subid AND p1.id = p2.id 
+0

कृपया इस अद्यतन क्वेरी को आज़माएं। –

+0

हालांकि 'id' /' subid' पर काम करना सुरक्षित है? क्या होगा यदि वास्तविक डेटा में 'आईडी' मान स्पैस हैं? क्या होगा यदि अलग-अलग 'सबिड' के लिए 'पैकेटनाम' समान है? – Timekiller

+0

@TimBiegeleisen यह अभी भी काम नहीं कर रहा है। –

1

आप एक ट्रिगर बना सकते हैं।

create trigger my_trigger before insert on mytable for each row 
begin 
DECLARE samecount INT; 
    set samecount = (select count(*) from mytable where packetname = new.packetname); 
    if samecount = 0 then 
    set new.updated_packet = new.packetname; 
    else 
    set new.updated_packet = concat(new.packetname,conv(samecount+9,10,36)); 
    end if; 
end; 

एक नई पंक्ति से पहले डाला जाता है, यह मायने रखता है कि कैसे एक ही packetname साथ कई पंक्तियों में मौजूद हैं। जब एक या अधिक होता है, तो गिनती + 9 को बेस 36 में परिवर्तित कर दिया जाता है - यह लगभग जेड तक सभी तरह से हेक्स के समान होता है। इसलिए, अगर गणना 1 है, तो यह 1+9=10=A बन जाती है। परिणामी मूल्य packetname के साथ सम्मिलित है। यदि समान पंक्तियां 37 से अधिक हो जाती हैं, तो यह विफल नहीं होगी, लेकिन इसके बजायको 38 के लिए जोड़ देगा।

ध्यान रखें कि यह बिल्कुल auto increment नहीं है और यह दौड़ की स्थिति के अधीन हो सकता है, जब दो उपयोगकर्ता एक ही समय में packetname डालते हैं, तो गणना क्वेरी दोनों के लिए समान मान वापस कर सकती है।

संपादित करें: नोट है कि जब आप बाद में है कि तालिका में नई पंक्तियां सम्मिलित और उन्हें updated_packet स्वचालित रूप से भर करना चाहते हैं की आवश्यकता होगी के लिए इस समाधान। आप भी मौजूदा पंक्तियों को अपडेट करना चाहते हैं, तो एक ही रास्ता है, एक ही संरचना के साथ एक नया टेबल बना एक नया टेबल पर कि ट्रिगर बनाने और उसके बाद क्या करना है

insert into newtable(id, subid, dollar, packetname) 
select id, subid, dollar, packetname from oldtable 
संबंधित मुद्दे