ÇÁ·Î±×·¥¿¡¼­ DB ¿¡ SQLÀ» º¸³¾¶§ ÆÄ¶ó¹ÌÅÍ Ã³¸®½Ã °í¹ÎµÉ¶§°¡ °¡²û ÀÖ½À´Ï´Ù. Oracle SQL ÀÇ IN ±¸¹®À» ÀοëÇØ¼­ ´Ù¾çÇÑ ¹æ½ÄÀ¸·Î ÆÄ¶ó¹ÌÅ͸¦ ¹ÙÀεù ÇÏ´Â ¹ýÀ» °íÂûÇØº¸¾Ò½À´Ï´Ù. º¸Åë SI ÇÁ·ÎÁ§Æ®¸¦ ÇÏ¸é °³¹ßÀÇ 70% ÀÌ»óÀº SQLÀ» ¸¸µå´Â ÀÏÀÎ°Í °°½À´Ï´Ù. ÇÁ·Î±×·¡¹ÖÇÒ¶§ ¾î·Á¿î ¹®Á¦¸¦ ÇØ°áÇϱâÀ§Çؼ± ¹Ýµå½Ã ´Ü°èÀûÀ¸·Î Á¢±ÙÇØ¾ßÇϴµ¥ ±×°Ç SQL µµ ¸¶Âù°¡Áö ÀÎ°Í °°½À´Ï´Ù. - ÀÛ¼ºÀÚ ÀÌ»ó¿Á (valenny@naver.com / valenny.tistory.com) - 2009.7.28 - °³¿ä 1. ¹ÙÀεù¿¡ ´ëÇѰíÂû 2. ¹ÙÀεùÀ» ÀÀ¿ëÇÏ¿© ÆÄ¶ó¹ÌÅÍ¿¡´ëÇØ À¯µ¿ÀûÀÎ(dynamic ÇÑ) SQL ÀÛ¼º - Áغñ -- Å×À̺í»ý¼º CREATE TABLE hijal_member ( user_name VARCHAR2(30), user_class VARCHAR2(30) ); -- ±âÃÊÀÚ·á ÀÔ·Â INSERT INTO hijal_member (user_name, user_class) VALUES ("õ³âÀü»çºñ", "Àü»ç"); INSERT INTO hijal_member (user_name, user_class) VALUES ("ÁãÀâ´Â¼Ò°ø³à", "¸¶¹ý»ç"); INSERT INTO hijal_member (user_name, user_class) VALUES ("Æç¼Ò´Ï¾ß", "¸¶¹ý»ç"); INSERT INTO hijal_member (user_name, user_class) VALUES ("¾Æ·é", "µå·çÀ̵å"); INSERT INTO hijal_member (user_name, user_class) VALUES ("¼û¸Å", "»çÁ¦"); INSERT INTO hijal_member (user_name, user_class) VALUES ("¿ï¹Ù¸£", "Àü»ç"); 1. ¸®ÅÍ·² vs ¹ÙÀεù (JAVA) <±¸Çö-1> /* ¸®ÅÍ·² */ String param = "õ³âÀü»çºñ"; sql = "SELECT * FROM hijal_member WHERE user_name = '"+param+"'"; /* ¹ÙÀεù */ String param = "õ³âÀü»çºñ"; sql = "SELECT * FROM hijal_member WHERE user_name = ? "; ... Áß·« ... pstm.setString(1, param); ... ½ÇÇàºÎ »ý·« ... java(ȤÀº ´Ù¸¥ ¾ð¾î) ¿¡¼­ DBMS ¿¡ SQLÀ̶û ÆÄ¶ó¹ÌÅ͸¦ Àü´ÞÇÏ´Â ¹æ¹ýÀº Å©°Ô Àú µÎ°¡Áö ¹æ½ÄÀÔ´Ï´Ù. ¸®ÅÍ·²·Î ÀÛ¼ºÇϰųª ¹ÙÀεùó¸®(PreparedStatement ÀÌ¿ë)ÇÏ´Â ¹æ½Ä ÀÌ µÎ¹æ½Ä ¸ðµÎ Àß ÀÛµ¿ÇÕ´Ï´Ù. ¾î¶»°Ô ÀÛ¼ºÇϵç ÇÁ·Î±×·¡¸ÓÀÇ ÀÔÀå¿¡¼­´Â ¸ðµÎ ÀÓ¹«¸¦ ¼öÇàÇß´Ù ¶ó°í ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ OTN(Oracle Technology Network) ¿¡¼± ¹ÙÀεùÀ» ±ÇÀåÇÕ´Ï´Ù.. ±× ÀÌÀ¯´Â "¿Ö PreparedStatement ¸¦ »ç¿ëÇØ¾ßÇϴ°¡¿¡ ´ëÇÑ ´ä"ÀÏ °ÍÀÔÀÌ´Ù. 2. ÇϳªÀÇ Çʵå¿Í ºñ±³µÇ´Â ¿©·¯ °ªÀ» ÀÎÀÚ·Î ÇÏ´Â Äõ¸® ¸¸µé±â(IN ~) ¾Õ¼­¼­ º» ¿¹Á¦¿¡¼­ ÇϳªÀÇ °ªÀ» °®´Â ÀÎÀÚ¿¡´ëÇØ¼± ºñ±³Àû °£´ÜÇÑ SQLÀ» ¸¸µé ¼ö°¡ ÀÖ¾ú½À´Ï´Ù. ÇÏÁö¸¸ °¡²û ¿ì¸®´Â ÇϳªÀÇ °ªÀÌ ¾Æ´Ï¶ó ¿©·¯ °ªÀ» ºñ±³Çؾ߸¸ ÇÏ´Â »óȲ¿¡ ³õÀÔ´Ï´Ù. ¾Æ·¡ÀÇ SQL ¹®À» º¸µµ·Ï ÇϰڽÀ´Ï´Ù. SELECT * FROM hijal_member WHERE user_name IN ('ÁãÀâ´Â¼Ò°ø³à', 'õ³âÀü»çºñ'); ¾ÆÁÖ ÀüÇüÀûÀÎ IN ±¸¹®À» ÀÌ¿ëÇØ¼­ ¿©·¯ Á¶°Ç¿¡´ëÇØ OR °Ë»öÀ» ÇÏ´Â ¿¹ÀÔ´Ï´Ù. ÀÌÁ¦ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ À̸¦ ¾î¶»°Ô ±¸ÇöÇÒ °ÍÀÎÁö °í¹ÎÇØ º¸µµ·Ï ÇϰڽÀ´Ï´Ù. <±¸Çö-2> /* ¸®ÅÍ·² */ String param = "'ÁãÀâ´Â¼Ò°ø³à','õ³âÀü»çºñ'"; sql = "SELECT * FROM hijal_member WHERE user_name IN ("+ param +")"; /* ¹ÙÀεù */ String[] param = { "ÁãÀâ´Â¼Ò°ø³à", "õ³âÀü»çºñ" }; sql = "SELECT * FROM hijal_member WHERE user_name IN ( ?, ? )"; ... Áß·« ... pstm.setString(1, param[0]); pstm.setString(2, param[1]); ... ½ÇÇàºÎ »ý·« ... À§Ã³·³ ÇѰ³ÀÇ Çʵå·Î µÎ°³ ÀÌ»óÀÇ °ªÀ» ºñ±³ÇؾßÇϴ°æ¿ì À§¿¡Ã³·³ IN ±¸¹®À» Ȱ¿ëÇÏ¿© ÆÄ¶ó¹ÌÅ͸¦ ¼¼ÆÃÇØÁÖ¸é µË´Ï´Ù. ¸®ÅÍ·² ÀÇ °æ¿ìµµ ¹ÙÀεùÀÇ °æ¿ìó·³ ·çÇÁ¸¦ µ¹·Á¼­ ÇÒ¼ö ÀÖÀ¸³ª, ¿©±â¼­´Â ±×³É ÆÄ¶ó¹ÌÅÍ ÀÚü¸¦ Á¶ÀÛÇØ¼­ SQLÀ» Á¶ÀÛÇÏ´Â ¹æ½ÄÀ¸·Î ÀÛ¼ºÇÏ¿´½À´Ï´Ù. ¸®ÅÍ·²Àº ±×³É Äõ¸® ÀÚü¸¦ º¯Çü½ÃŰ´Â ¹æ½ÄÀ̹ǷΠ¸Å¿ì ´ÙÀ̳ª¹Í Äõ¸®¸¦ ¸¸µé¾î ³¾ ¼ö ÀÖ½À´Ï´Ù. ÇÏÁö¸¸, ¾Õ¼­¼­µµ ¾ð±ÞÇßµíÀÌ ¿ì¸° °¡±ÞÀû ÀÎÀÚ¸¦ ¹ÙÀεùó¸®ÇÏ¿© ´ÙÀ̳ª¹ÍÇÏ°Ô ÇÏ·Á´Âµ¥ ÃÐÁ¡À» ¸ÂÃß·Á ÇÕ´Ï´Ù. <±¸Çö-3> /* ÇÁ·Î±×·¡¹Ö¾ð¾î·Î ´ÙÀ̳ª¹ÍÇÑ SQL ¸¸µé±â */ String[] param = { "ÁãÀâ´Â¼Ò°ø³à", "õ³âÀü»çºñ" }; sql = "SELECT * FROM hijal_member WHERE user_name"; sql += " IN ("; for(int i=0; i0) sql+=", "; sql += "? "; } sql += " )"; ... Áß·« ... for(int i=0; i SELECT * FROM hijal_member WHERE user_name IN ( SELECT 'ÁãÀâ´Â¼Ò°ø³à' FROM dual UNION ALL SELECT 'õ³âÀü»çºñ' FROM dual ); À§ÀÇ SQL Àº °ú µ¿ÀÏÇÑ °á°ú¸¦ º¸¿©ÁÝ´Ï´Ù. °ýÈ£¾È¿¡ ÀÏ·Ä·Î ¹èÄ¡ÇßÀ»¶§º¸´Ù ÄÚµù·®Àº ¸¹¾ÆÁ³Áö¸¸ ¹«¾ùÀΰ¡ ´õ Á¤±ÔÈ­µÈ ÆÐÅÏÀÌ ´«¿¡ ¶ë´Ï´Ù. ¸¸¾à ºñ±³µÇ¾îÁ®¾ßÇÒ ÀÎÀÚ°ªÀÌ ´õ ¸¹¾ÆÁø´Ù¸é, SQL Àº ´ÙÀ½Ã³·³ ¼öÁ¤µÇ¾îÁ®¾ßÇÒ°ÍÀÔ´Ï´Ù. SELECT * FROM hijal_member WHERE user_name IN ( SELECT 'ÁãÀâ´Â¼Ò°ø³à' FROM dual UNION ALL SELECT 'õ³âÀü»çºñ' FROM dual UNION ALL SELECT '¾Æ·é' FROM dual ); ÇÏÁö¸¸ ÀÌ·± SQL¹®Àº Åäµå³ª SQL*Plus ¿¡¼­ °ªÀ» È®ÀÎÇϱâÀ§ÇÑ Áï½Ã¼º SQL ÀÌÁö ÇÁ·Î±×·¡¹Ö½Ã Data Access Module À» ±¸¼ºÇϱ⿡´Â ¹«¾ùÀΰ¡ ºÎÁ·Çغ¸ÀÔ´Ï´Ù. ù¹øÂ°·Î ÆÄ¶ó¹ÌÅͰ¡ Á¤ÀûÀ̾î¾ßÇϴµ¥, ÆÄ¶ó¹ÌÅͰ¡ °¹¼ö°¡ °¡º¯ÀûÀ¸·Î º¸ÀÔ´Ï´Ù. ÆÄ¶ó¹ÌÅͰ¡ °¡º¯ÀûÀÎ °æ¿ì¿¡´Â ÀÌ ¾ÕÀý¿¡¼­ ´Ù·ç¾ú´ø ÇÁ·Î±×·¡¹Ö¾ð¾î¿¡¼­ ´ÙÀ̳ª¹ÍÇÑ°Ô ¹ÙÀεùÀ» ó¸®ÇÏ´Â°Ô ¿ÀÈ÷·Á ´õ ¾î¿ï·Á º¸ÀÔ´Ï´Ù. SQL ¿¡¼­ À¯µ¿ÀûÀΠ󸮸¦ À§Çؼ­´Â ±¸ºÐÀÚ¸¦ °®´Â ¹®ÀÚ¿­·Î¼­ ´ÜÀÏ ÆÄ¶ó¹ÌÅÍ·Î ¹Þ¾Æ ó¸®ÇÏ´Â°Ô Çö¸íÇØ º¸ÀÔ´Ï´Ù. ÀÌ ±Û¿¡¼­ °¡Àå ÇÙ½ÉÀÎ ºÎºÐÀÌ ±¸ºÐÀÚ¸¦ °®´Â ¹®ÀÚ¿­À» row data ·Î Ç¥ÇöÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. row data ·Î Ç¥ÇöÀÌ µÇ±â¸¸Çϸé IN ( SELECT .... ) Àý¾È¿¡ Áý¾î³Ö±â¸¸ ÇÏ¸é µÇ´Ï±ñ¿ä. SELECT ROWNUM as rnum ,param ,dlmtr FROM ( SELECT 'õ³âÀü»çºñ|ÁãÀâ´Â¼Ò°ø³à' AS param ,'|' AS dlmtr FROM dual ) CONNECT BY LEVEL <= LENGTH(param)-LENGTH(REPLACE(param,dlmtr))+1; °á°ú> -------+--------------------+---------+ rnum| param | dlmtr -------+--------------------+---------+ 1 |õ³âÀü»çºñ|ÁãÀâ´Â¼Ò°ø³à| | 2 |õ³âÀü»çºñ|ÁãÀâ´Â¼Ò°ø³à| | -------+--------------------+---------+ ÀÌ SQL ¿¹Á¦ÀÇ ÇÙ½ÉÀº 'õ³âÀü»çºñ|ÁãÀâ´Â¼Ò°ø³à' ¶ó´Â µÎ°³ÀÇ ºñ±³ÀÎÀÚ¸¦ °®´Â ÇϳªÀÇ ÀÎÀÚ¿¡ ´ëÇØ ÀÎÀÚÀÇ °¹¼ö¸¸Å­ ROW °¹¼ö¸¦ ¸¸µé¾î ÁÖ´Â ±â´ÉÀ» ¼öÇà ÇÑ´Ù´Â °Í ÀÔ´Ï´Ù. REPLACE(...) ´Â ¹®ÀÚ¿­À» ġȯÇÒ¶§ ¾²´Â ÇÔ¼öÀÔ´Ï´Ù. LENGTH(...)´Â ±ÛÀÚ¼ö¸¦ ±¸ÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. ÀÌÁ¦ ¹«¾ùÀ» ÇØ¾ß ÇÒ±î¿ä? param ÀÇ ³»¿ëÀ» rnum À̶ó´Â index ÀÇ ¹øÈ£¿¡ ¸Â´Â ¹è¿­ ¿ä¼Ò·Î Á¢±ÙÇÏ°í ½Í¾îÁöÁÒ? ÀÌÁ¦ ±× ¹æ¹ýÀ» ¸¸µé¾î º¾½Ã´Ù. ¿À¶óŬÀÇ ±âº» ÇÔ¼öµé¸¸ °¡Áö°í ÃæºÐÈ÷ ÇØ ³¾¼ö ÀÖ½À´Ï´Ù. SELECT SUBSTR ( dlmtr||param||dlmtr, INSTR(dlmtr||param||dlmtr,dlmtr,1,idx_no)+1 , (INSTR(dlmtr||param||dlmtr,dlmtr,1,idx_no+1) - INSTR(dlmtr||param||dlmtr,dlmtr, 1,idx_no))-1 ) AS result_str FROM ( SELECT 'õ³âÀü»çºñ|ÁãÀâ´Â¼Ò°ø³à' AS param ,'|' AS dlmtr ,1 AS idx_no FROM DUAL ); °á°ú> -------------------- result_str -------------------- õ³âÀü»çºñ -------------------- ¹«¾ð°¡ »ó´çÇÑ º¹ÀâÇÑ Äõ¸®°¡ ź»ýÇß½À´Ï´Ù. ÀÌ SQL ÀÇ ÇÙ½ÉÀº ¹Ù·Î SUBSTR ÇÔ¼ö¿Í INSTR ÇÔ¼ö¸¦ Á¶ÇÕÇØ¼­ idx_no Áï 1¹øÂ° ¿ä¼Ò¸¦ »Ì¾Æ³»´Â°Ô ÇÙ½ÉÀÔ´Ï´Ù. ¸¸¾à idx_no ¸¦ 2 ·Î Çß´Ù¸é, 'ÁãÀâ´Â¼Ò°ø³à' ¸¦ °á°ú·Î ¸®ÅÏÇßÀ»°Ì´Ï´Ù. ÀÚ ÀÌÁ¦ ¿Í ¸¦ Á¶ÇÕÇØ¼­ row data ·Î °¢°¢ÀÇ ¿ä¼Ò¸¦ ²ôÁý¾î ³»º¸µµ·Ï ÇϰڽÀ´Ï´Ù. SELECT SUBSTR ( dlmtr||param||dlmtr, INSTR(dlmtr||param||dlmtr,dlmtr,1,rnum)+1 , (INSTR(dlmtr||param||dlmtr,dlmtr,1,rnum+1) - INSTR(dlmtr||param||dlmtr,dlmtr, 1,rnum))-1 ) AS user_name FROM ( SELECT ROWNUM as rnum ,param ,dlmtr FROM ( SELECT 'õ³âÀü»çºñ|ÁãÀâ´Â¼Ò°ø³à' AS param ,'|' AS dlmtr FROM dual ) CONNECT BY LEVEL <= LENGTH(param) - LENGTH(REPLACE(param,dlmtr))+1 ); °á°ú> -------------------- user_name -------------------- õ³âÀü»çºñ ÁãÀâ´Â¼Ò°ø³à -------------------- °¥¼ö·Ï SQL ÀÌ º¹ÀâÇØÁ®°¡°íÀÖÁö¸¸, ±¸ºÐÀÚ¸¦ °¡Áø ÆÄ¶ó¹ÌÅ͸¦ row data ·Î pivot ó¸® Çϴµ¥ ¼º°øÇÏ¿´½À´Ï´Ù. ±×·³ hijal_member Å×ÀÌºí¿¡¼­ À̸¦ ÃëÇÕÇØº¾½Ã´Ù. SELECT * FROM hijal_member WHERE user_name IN ( SELECT SUBSTR ( dlmtr||param||dlmtr, INSTR(dlmtr||param||dlmtr,dlmtr,1,rnum)+1 , (INSTR(dlmtr||param||dlmtr,dlmtr,1,rnum+1) - INSTR(dlmtr||param||dlmtr,dlmtr, 1,rnum))-1 ) FROM ( SELECT ROWNUM as rnum ,param ,dlmtr FROM ( SELECT :param AS param ,:dlmtr AS dlmtr FROM dual ) CONNECT BY LEVEL <= LENGTH(param) - LENGTH(REPLACE(param,dlmtr))+1 ) ); ÆÄ¶ó¹ÌÅÍ¿Í ±¸ºÐÀÚ¸¦ Çѹø¾¿ ¹ÙÀεùÇÏ¿© ¿øÇÏ´Â °á°ú¸¦ ¾òÀ»¼ö ÀÖ½À´Ï´Ù. ±×·±µ¥ ÀÌ Äõ¸® ¶ÇÇÑ ¸Å¿ì º¹ÀâÇØº¸À̰í ÁöÀúºÐÇØ º¸ÀÔ´Ï´Ù. ¿À¶óŬ 10 ºÎÅÍ´Â Á¤±Ô½Ä ÆÐÅÏÀ» ÀÌ¿ëÇÏ¿© º¸´Ù °£´ÜÇÏ°Ô ÀÛ¾÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. substr ´ë½Å regexp_substr À» ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. SELECT * FROM hijal_member WHERE user_name IN ( SELECT REGEXP_SUBSTR (param,'[^' || dlmtr || ']+',1,LEVEL) FROM ( SELECT :param AS param ,:dlmtr AS dlmtr FROM DUAL) CONNECT BY LEVEL <= LENGTH (param) - LENGTH (REPLACE (param, dlmtr, '')) + 1);