mysql逗号分割字段的行列转换测试改进
<p>由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式。即同一个列中存储了多个属性值(具体结构见下表)。</p><p>这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果。</p>
<span class="cnblogs_code_copy"></span><p style="margin: 10px auto; line-height: 19px; font-family: verdana, sans-serif; font-size: 13px;">表数据:</p><table style="border: 1px solid rgb(192, 192, 192); border-image: none; width: 143px; height: 142px; font-family: verdana, sans-serif; border-collapse: collapse;" border="0"><tbody><tr><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">ID</td><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">Value</td></tr><tr><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">1</td><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">tiny,small,big</td></tr><tr><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">2</td><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">small,medium</td></tr><tr><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">3</td><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">tiny,big </td></tr></tbody></table><p> </p><p style="margin: 10px auto; line-height: 19px; font-family: verdana, sans-serif; font-size: 13px;">期望得到结果:</p><table style="border: 1px solid rgb(192, 192, 192); border-image: none; font-family: verdana, sans-serif; border-collapse: collapse;" border="0"><tbody><tr><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">ID</td><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">Value</td></tr><tr><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">1</td><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">tiny</td></tr><tr><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">1</td><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">small</td></tr><tr><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">1</td><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">big</td></tr><tr><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">2</td><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">small</td></tr><tr><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">2</td><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">medium</td></tr><tr><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">3</td><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">tiny</td></tr><tr><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">3</td><td style="padding: 3px; border: 1px solid rgb(192, 192, 192); border-image: none; border-collapse: collapse;">big </td></tr></tbody></table><p> </p><p> </p><pre><span style="line-height: 1.5;">#需要处理的表 </span><span style="color: rgb(0, 0, 255); line-height: 1.5;">create</span> <span style="color: rgb(0, 0, 255); line-height: 1.5;">table</span> tbl_name (ID <span style="color: rgb(0, 0, 255); line-height: 1.5;">int</span> ,mSize <span style="color: rgb(0, 0, 255); line-height: 1.5;">varchar</span>(<span style="color: rgb(128, 0, 0); line-height: 1.5; font-weight: bold;">100</span><span style="line-height: 1.5;">)); </span><span style="color: rgb(0, 0, 255); line-height: 1.5;">insert</span> <span style="color: rgb(0, 0, 255); line-height: 1.5;">into</span> tbl_name <span style="color: rgb(0, 0, 255); line-height: 1.5;">values</span> (<span style="color: rgb(128, 0, 0); line-height: 1.5; font-weight: bold;">1</span>,<span style="color: rgb(255, 0, 0); line-height: 1.5;">'</span><span style="color: rgb(255, 0, 0); line-height: 1.5;">tiny,small,big</span><span style="color: rgb(255, 0, 0); line-height: 1.5;">'</span><span style="line-height: 1.5;">); </span><span style="color: rgb(0, 0, 255); line-height: 1.5;">insert</span> <span style="color: rgb(0, 0, 255); line-height: 1.5;">into</span> tbl_name <span style="color: rgb(0, 0, 255); line-height: 1.5;">values</span> (<span style="color: rgb(128, 0, 0); line-height: 1.5; font-weight: bold;">2</span>,<span style="color: rgb(255, 0, 0); line-height: 1.5;">'</span><span style="color: rgb(255, 0, 0); line-height: 1.5;">small,medium</span><span style="color: rgb(255, 0, 0); line-height: 1.5;">'</span><span style="line-height: 1.5;">); </span><span style="color: rgb(0, 0, 255); line-height: 1.5;">insert</span> <span style="color: rgb(0, 0, 255); line-height: 1.5;">into</span> tbl_name <span style="color: rgb(0, 0, 255); line-height: 1.5;">values</span> (<span style="color: rgb(128, 0, 0); line-height: 1.5; font-weight: bold;">3</span>,<span style="color: rgb(255, 0, 0); line-height: 1.5;">'</span><span style="color: rgb(255, 0, 0); line-height: 1.5;">tiny,big</span><span style="color: rgb(255, 0, 0); line-height: 1.5;">'</span><span style="line-height: 1.5;">); #用于循环的自增表 </span><span style="color: rgb(0, 0, 255); line-height: 1.5;">create</span> <span style="color: rgb(0, 0, 255); line-height: 1.5;">table</span> incre_table (AutoIncreID <span style="color: rgb(0, 0, 255); line-height: 1.5;">int</span><span style="line-height: 1.5;">); </span><span style="color: rgb(0, 0, 255); line-height: 1.5;">insert</span> <span style="color: rgb(0, 0, 255); line-height: 1.5;">into</span> incre_table <span style="color: rgb(0, 0, 255); line-height: 1.5;">values</span> (<span style="color: rgb(128, 0, 0); line-height: 1.5; font-weight: bold;">1</span><span style="line-height: 1.5;">); </span><span style="color: rgb(0, 0, 255); line-height: 1.5;">insert</span> <span style="color: rgb(0, 0, 255); line-height: 1.5;">into</span> incre_table <span style="color: rgb(0, 0, 255); line-height: 1.5;">values</span> (<span style="color: rgb(128, 0, 0); line-height: 1.5; font-weight: bold;">2</span><span style="line-height: 1.5;">); </span><span style="color: rgb(0, 0, 255); line-height: 1.5;">insert</span> <span style="color: rgb(0, 0, 255); line-height: 1.5;">into</span> incre_table <span style="color: rgb(0, 0, 255); line-height: 1.5;">values</span> (<span style="color: rgb(128, 0, 0); line-height: 1.5; font-weight: bold;">3</span>);