MySql command for split string function

posted on 01 Jun 2010 15:44 by ouilek in PROGRAMMING

ความโชคร้ายไม่เคยจางหายจากเรา.. เฉกเช่นเดียวกับที่พระท่านได้พูดว่า "ทุกข์อยู่กับเราไม่นาน.. สุขก็อยู่ไม่นานเช่นกัน" ขึ้นอยู่กับว่าเราจะเก็บเกี่ยวช่วงเวลาแห่งความทุกข์หรือความสุขไว้กับตัวเรา.. เพื่อเป็นความทรงจำที่ดี..

ครั่งหนึ่งก่อนหน้านี้.. อุ้ยเคยตกงาน ไม่สิตอนนั้นเรียกว่า "เกือบว่างงาน" เพราะว่าไม่ได้ตกงานและไม่ได้ว่างงาน.. เพียงแต่บริษัทที่ทำอยู่กำลังจะปิดตัวลง แล้วเกิดจิตตกกลัวหางานไม่ได้.. เลยเตรียมตัวทุกอย่าง.. หางาน ขายสัตว์เลี้ยงที่รักมาก พร่ำบ่นกับคนนั้นคนนี้ แม้กระทั่งในไดอารี่ของตัวเอง.. ไม่กล้าใช้เงิน.. ไม่กล้าไปไหน.. ล้มแผนเที่ยวทุกอย่าง.. แต่แล้ว.. ก็หางานได้ ก็ไม่ได้ว่างงาน ไม่ได้ตกงาน แถมได้เงินเยอะกว่าเก่าอีกด้วย..

ครั้งนี้ไม่เหมือนครั้งนั้น.. มันแย่กว่ามากๆ เพราะว่าอุ้ยถูกให้ออกจากบริษัทโดยมีการจ่ายค่าชดเชยให้ 1 เดือน.. ซึ่งถ้าอุ้ยพูดแบบนี้กับใคร.. ก็คงมีคนคิดว่า อุ้ยไปทำไรว่ะ ถึงได้โดนให้ออก.. แต่มันมีอะไรมากกว่านั้น ตั้งแต่หนังสือสัญญา (ฝากไว้กับคนที่จะต้องมีการเซ็นสัญญาการทำงานใดๆ ก็ตาม ควรอ่านให้ละเอียด) ซึ่งระบุว่า.. เป็นพนักงานประจำ แต่ประจำ 1 ปี ซึ่งด้วยความที่เงินเดือนมันเยอะ.. อะไรที่เอ๊ะใจก็ไม่ได้มีผล แต่การทำงานก็ไม่ได้มีปัญหาอะไรมาก ได้ทำ Silverligth ซึ่งค่อนข้างใหม่แต่ก็ชอบ

แต่ก็นั่นแหละ.. เมื่อบริษัทประสบปัญหาทางการเงิน.. เค้าจำเป็นต้องลดพนักงานลงโดยการให้ออกพร้อมเงินชดเชยให้หนังสือแจ้งความประสงค์ วันนั้นพนักงานที่ได้รับแบบอุ้ยมี 3 คน ที่นี้ก็ถือว่าการตกงานสมบูรณ์แบบ อุ้ยมีโอกาสได้พักอยู่บ้านจริงๆ เต็มๆ 1 เดือน และได้รู้ว่างานนั้นหายากมากๆ มากกว่าปีที่แล้วเยอะเลย

ปัจจุบันอุ้ยทำงานอยู่บริษัทแห่งหนึ่ง แถวๆ สุขุมวิท บริษัทของต่างประเทศ (เหมือนเดิม.. อย่างที่เคยบอกไม่ชอบทำบริษัทคนไทย) มีพนักงานเยอะแยะ เริ่มงานเมื่อวันที่ 1 เมษา ทุกอย่างดูน่าจะดี แต่คนเราเมื่อเคยชินกับอะไรสักอย่างไปแล้ว.. จะให้เปลี่ยนแปลงก็ต้องใช้เวลานิดนึง อุ้ยกลับมาเขียน .NET ปกติ และทุกอย่างก็เหมือนเข้าสู่อะไรเดิมๆ รวมทั้งเงินเดือนด้วย ที่ได้เท่าเดิม.. แต่ชีวิตมันไม่เหมือนเดิมแล้วนี้สิ ปัญหา!!

 

อ่ะ.. พอล่ะกับชีวิตที่หายไป.. จะได้เริ่มต้นเขียนอะไรตามที่ตั้งชื่อไว้สักที.. ส่วนใหญ่แล้วเรื่องที่เกี่ยวกับงานที่ทำ ที่อุ้ยเลือกมาเขียนเพราะว่า มันเป็นอะไรที่อุ้ยหายากในเน็ต อืมม ต้องบอกก่อนว่า Developer ส่วนใหญ่.. ทำงานคู่กับ Search Engine เพราะว่างานที่ได้รับในแต่ละ Project แต่ละแบบนั้นมันแตกต่างไปตาม requirement ซึ่งอะไรที่ใหม่ หรือดัดแปลงพลิกแพลง ถ้าเราคิดไม่ออกว่าควรใช้คำสั่งอะไร ที่จะช่วยให้เขียนง่ายและ performance ดี เราก็จะใช้ search engine ช่วยเรา.. อย่างน้อยๆ คนทั้งโลกน่าจะเคยเจอบ้าง

ตอนนี้อุ้ยเขียนโปรแกรมด้วย C# เหมือนเดิมที่ไม่เหมือนเดิมคือ Database ที่เปลี่ยนจาก Sql Server มาเป็น MySql จริงๆ แล้วในส่วนของ command น่าจะคล้าย.. แต่ก็คล้ายไม่ได้เหมือน นั่นก็แปลว่าอุ้ยต้องเริ่มใหม่

 

โอเค.. ในการส่ง parameter เป็น string type ยาวๆ นั้น เพื่อที่จะง่ายต่อการนำมา query แต่จะยากตอนตัด string เชื่อว่า Developer ทุกคนมีแนวทางที่แตกต่างกัน.. ส่วนที่จะแชร์ต่อไปนี้เป็นแนวทางของอุ้ย.. เข้าใจว่าถ้าเป็น command ของ Sql Server น่าจะมีคำสั่งที่ใช้ในการ split string ได้

โดยทั่วไป.. เราจะใช้ Store Procedure (SP หมายถึงอะไร มีประโยชน์อย่างไร ตาม link ไปเลยจ้า link1 link2) ในการเขียน command เพื่อ retrive data

หน้าตาเจ้า Store Procedure ที่เราจะเขียนก็จะประมาณนี้ มองเผินๆ ก็เหมือน Notepad แต่ยังไงก็ตาม มันก็มีคำสั่ง มีรูปแบบของมัน หลังจากที่เราเขียนเสร็จก็ให้กดที่ปุ่ม Execute SQL จากนั้น มันจะทำการตรวจสอบและเซฟ ไปต่อไปเราไปเจาะในรายละเอียดกัน

อุ้ยจะไม่ลงรายละเอียดเรื่องการเขียน Store Procedure นะคะ.. เพราะมีคนเขียนไว้มากมายแล้ว แต่ถ้าใครอยากจะเริ่มเรียนรู้ ก็ไปตามลิงค์นี้ได้เลย

  • Store Procedure สำหรับ MySql

http://dev.mysql.com/tech-resources/articles/mysql-storedprocedures.html

  • Store Procedure สำหรับ SqlServer

http://msdn.microsoft.com/en-us/library/aa174792(SQL.80).aspx

มาเริ่มดูในส่วนของ split string กันเลยค่ะ อุ้ยจะใช้ตัวอย่าง string ของอุ้ยที่ต้องส่งมา query เป็นชุดๆ โดยต่อ string ด้วยการใช้ comma (,) คั่นระหว่าง string แต่ละตัว และจะใช้คำสั่ง Where like ในการ query ต่อไป

ตัวอย่าง string parameter ที่ถูกส่งเข้ามา จะแทนค่าแบบนี้ เด่วอุ้ยจะ comment line of code เลย อ่านตามตัวสีเขียวๆ ได้เลยนะ ว่าแต่ละบรรทัดทำงานยังไง

/* กำหนด @sPropertyType */
SET
 @sPropertyType = "PropertyType:2ja herbergja,3ja herbergja,4ra til 7 herbergja,Atvinnuhúsnæði,Bílageymsla,Bílskúr,Bílskúr + geymsla,Einbýli,Eldri borgarar,Fjölbýli,Garðskáli,Geymsla,Grunnur";

/* การ comment code ภายใน store procedure */
/* ในส่วนนี้อุ้ยใช้คำสั่ง REPLACE แทนที่คำว่า PropertyType: ด้วยค่าว่าง */

SET @sPropertyType = REPLACE(@sPropertyType, 'PropertyType:', '');
/* คำสั่ง LENGTH ใน MySql น่าจะเหมือนกับคำสั่ง COUNT ใน SQLServer ใช้ในการนับจำนวน String */
IF LENGTH(@sPropertyType) > 0
THEN
  
/* กำหนดค่า @pIndex เท่ากับ 1 และกำหนดค่า @pCount เท่ากับ 0 */
   SET @pIndex = 1;
   SET @pCount = 0;
  
/* คำสั่ง WHILE...DO ใช้ในการวนลูป */
   /* ในที่นี้ อุ้ยวนลูปตั้งแต่ 0 ไปจนถึงจำนวนตัวอักษรที่อยู่ใน @sPropertyType สมมุติมีสัก 20 ตัว ก็จะวน 20 รอบ */

   WHILE @pIndex <= CHAR_LENGTH(@sPropertyType) DO

      /* ใช้คำสั่ง IF และ SUBSTRING เพื่อหาว่าตำแหน่งที่ 1 นั่นมีตัว Comma(,) หรือป่าว */
      IF SUBSTRING(@sPropertyType, @pIndex, 1) = ','
      
THEN
        
/* ถ้ามี Comma ก็จะเข้ามาทำภายในคำสั่ง IF โดยการ บวก @pCount เข้าไป 1 */
         SET @pCount = @pCount + 1;

         /* เช็ค IF ถ้า @pCount มีค่ามากกว่า 0 */
         IF @pCount > 0
         
THEN
           
/* ถ้า @pCount มีค่าเท่ากับ 1 ก็จะทำภายใน THEN */
            IF @pCount = 1
            
THEN
              
/* ใช้คำสั่ง SUBSTRING เพื่อตัดคำ โดยที่ จะตัดที่ตำแหน่งที่ 1 จนถึงตำแหน่งที่ @pIndex - 1 */
               /* ในที่นี้ ถ้าแทนค่าตามนี้คือ @sPropertyType = "ouinaruk" และ @pIndex = 5 */
               /* แทนด้วยคำสั่งจะเป็น SUBSTRING("ouinaruk", 1, 5-1 = 4) ค่าที่ได้จะเป็น ouin */

               SET @propertyTypeSearch = SUBSTRING(@sPropertyType, 1, @pIndex - 1);
               /* CHAR_LENGTH นับจำนวนตัวอักษร */
               SET @tempProperty = CHAR_LENGTH(@propertyTypeSearch);
               /* คำสั่ง CONCAT ใช้ในกรณีที่ต้องการบวก string ยาวต่อกันไปเรื่อยๆ */
               SET @whereClause = CONCAT(@whereClause, " AND (property.main_property_type like '%" , @propertyTypeSearch , "%'");
            /* ถ้า @pCount มีค่าใดๆ ที่ไม่เท่ากับ 1 จะเข้ามาทำหลังจาก ELSE */
            
ELSE
              
/* อันนี้จะเป็นลักษณะเดียวกันกับด้านบน แต่ต่างกันตรงที่จะตัดกันโดยเริ่มต้นที่ตำแหน่ง ที่จำนวนของค่า @tempProperty */
               SET @propertyTypeSearch = SUBSTRING(@sPropertyType, @tempProperty, @pIndex - @tempProperty);
               /* เราจะบวกค่าของจำนวน @tempProperty ไปเรื่อยๆ เพื่อตัดคำที่หาได้ยาวๆ ออกไป */
               SET @tempProperty = @tempProperty + CHAR_LENGTH(@propertyTypeSearch);
               /* หลังจากตัดคำแล้วค่าที่ได้อาจจะมี Comma ติดอยู่ก็ให้ทำการแทน Comma ด้วยค่าว่างไป โดยใช้คำสั่ง REPLACE */
               SET @propertyTypeSearch = REPLACE(@propertyTypeSearch, ',', '');
               /* ในส่วนนี้ก็จะเหมือนกับด้านบน แต่ให้สังเกตุคำสั่ง OR ที่อยู่ภายในคำสั่ง CONCAT เด่วอุ้ยจะอธิบายในส่วนนี้อีกที */
               SET @whereClause = CONCAT(@whereClause, " OR property.main_property_type like '%" , @propertyTypeSearch , "%'");
            /* จำเป็นมาก อย่าลืมปิดทุกคำสั่งด้วยนะ ไม่งั้นจะ Execute ไม่ผ่านจ้า */            
            END IF;
         END IF;
      END IF;

      /* ในส่วนนี้ใช้ในการเพิ่มค่าให้กับ @pIndex  */
      SET @pIndex = @pIndex + 1;
END WHILE;

      /* ในส่วนนี้เป็นการเพิ่ม ในส่วนของ ปิดวงเล็บ ) เด่วอุ้ยจะอธิบายอีกทีว่าทำไม */
      SET @whereClause = CONCAT(@whereClause, ")");
END IF


หลังจากทำการ Execute แล้ว Run Store Procedure ด้านบนแล้ว เราจะมาดูค่า @whereClause กัน ค่าที่ได้จาก @whereClause นั่นจะนำเป็นต่อ string ในส่วนของ Where หลักอีกที เพื่อใช้ในการ query หาค่าต่อไป เด่วดูใน Code เลยค่ะ

AND (property.main_property_type like '%2ja herbergja%'
OR property.main_property_type like
'%a3ja herbergja%'
OR property.main_property_type like '%4ra til 7 herbergja%'
OR property.main_property_type like
'%Atvinnuhúsnæði%'
OR property.main_property_type like
'%Bílageymsla%'
OR property.main_property_type like '%Bílskúr%'
OR property.main_property_type like
'%Bílskúr + geymsla%'
OR property.main_property_type like
'%Einbýli%'
OR property.main_property_type like
'%Eldri borgarar%'
OR property.main_property_type like '%Fjölbýli%'
OR property.main_property_type like
'%Garðskáli%'
OR property.main_property_type like
'%Geymsla%'
OR property.main_property_type like '%Grunnur%')
 

 

เป็นอันเสร็จสิ้นกระบวนความ อ่อ.. เพิ่มเติมอีกนิดนึงนะคะ ตรงที่ () เปิดปิดวงเล็บ เป็นเงื่อนไขในการ query เพื่อที่จะ query หา property type ทั้งหมด คือถ้าไม่มีอันนี้ให้ไปหาอันนั้น ทำนองนั้นอ่ะแหละ ส่วนคำสั่ง like '%%' ก็เพื่อที่จะทำการหาแบบทุกตัวอักษร ซ้ายไปขวา ขวามาซ้าย

ใครมีอะไรที่เด็ดกว่านี้แวะมาบอกอุ้ยบ้างก็ได้นะคะ ถือว่า share กันไป หรือว่าใครยังงง สงสัยตรงไหนฝากถามกันเข้ามาได้ค่ะ แล้วถ้าใครจะ share ก็ไม่ว่ากัน แต่ช่วย reference ให้ credit กันนิดนึง กว่าจะเล่นสีได้แบบนี้ ยากนะจ๊ะ ไปล่ะ บายๆ

Comment

Comment:

Tweet



555+ สังเกตุว่า จะมีแบบนี้มาเป็นพักๆนานๆที
ขอบคุณนะจ๊ะ ที่นํามาแบ่งปัน
surprised smile

#2 By riddler on 2010-06-03 07:49

ขอสารภาพว่า entry นี้มีสาระเกินไปอ่านไม่ไหว (อ่านไม่รู้เรื่อง 55+)

#1 By Maxtrix™ on 2010-06-02 22:29