質問: DB上に10桁か11桁の電話番号が登録されているのですが、それをTEL1(先頭2桁~3桁)、TEL2(真ん中4桁)、TEL3(後半4桁)で取得したいのですがどのように分割すればよいでしょうか?
回答: MySQL単体でやるのはちょっと冗長なSQLになりそうなので、プログラムをかませた方が良いと思います。 プログラムでは、以下のような流れで取得できるはずです。 1.市外局番の一覧を配列に持つなどして管理する 2.電話番号の先頭2~5桁までで、1で持っている市外局番に一致する値を抜き出す 3.残った番号の末尾4ケタを抜き出す 4.2で取得したのがTel1、最後まで残った番号がTel2、3で取得したのがTel3となる 市外局番の一覧は総務省がPDFで提供しているので、コレが一番確実かと思います。 以下、PHPでやった場合の処理となります。 ``` //市外局番を配列で管理。あとで照合するときに全件で照合させると効率が悪いので、先頭2桁をキーにして分割(DBから取得でも良い) $shigaiKyokubanList = array( '01' => array('011', '0123', '0124', '0125'・・・), '02' => array('0220', '0223', '0224'・・・), '03' => array('03'), '04' => array('0422', '0428', '042'・・・ ・・・ ); $telList = getTelList(); //ここで、DBから電話番号の全件をselectしてきたモノとします。 $separatedTelList = array();//tel1, tel2, tel3に分割された電話番号を格納する配列 //電話番号リストをループ foreach($telList as $tel) { //市外局番の配列のうち、先頭2桁をキーとして2階層目の配列を取り出し、ループ foreach($shigaiKyokubanList[substr($tel, 0, 2)] as $shigaiKyokuban) { //候補の市外局番から始まる前提で正規表現マッチング if(!preg_match('/^('.$shigaiKyokuban.')([0-9]+)([0-9]{4})$/', $matches) || count($matches) < 4) { //マッチしない場合、次の市外局番と照合する continue; } else { //マッチした場合、tel1, tel2, tel3をキーとする配列に格納する $separatedTelList[] = array('tel1' => $matches[1], 'tel2' => $matches[2], 'tel3' => $matches[3]); } } ```