MySQLで住所（都道府県）を分ける（分割する）方法


MySQLにおいて、"大阪府守口市○○○"という文字列から、都道府県にあたる"大阪府"という文字列だけ取り出したいです。

`SUBSTR` 関数で行っています。

下記の方法で指定した文字取得できましたが、1~3まで指定、下記のように出力されます。

[code]

    SELECT SUBSTRING(`住所`,1,3) FROM address
    
[/code]

元データ

[code]

    大阪府○○○○
    東京都○○○○
    栃木県○○○○
    北海道○○○○
    沖縄県○○○○
    和歌山○○○○
    神奈川○○○○
    
[/code]

出力

[code]

    大阪府
    東京都
    栃木県
    北海道
    沖縄県
    和歌山
    神奈川
    
[/code]

**実現したい結果**  
現在3文字の都道府県でしたら問題なくできますが、下記のように4文字の都道府県を正規表現で住所を分割したい場合は可能でしょうか。

[code]

    大阪府
    東京都
    栃木県
    北海道
    沖縄県
    和歌山県
    神奈川県
    
[/code]

ご教授いただけると幸いです。




REGEXP_SUBSTRとREGEXP_REPLACEを使えない場合(MySQL 5.6 or 5.7)、下記のクエリをたみしてみてください。

[code]

    SELECT 
    IF (
      LEFT(`住所`,INSTR(`住所`, '県')-1) = '',
      (
        IF (
          LEFT(`住所`,INSTR(`住所`, '府')-1) = '', 
            ( 
            IF (
              LEFT(`住所`,INSTR(`住所`, '都')-1) = '', 
              ( 
                IF (
                  LEFT(`住所`,INSTR(`住所`, '道')-1) = '', 
                  `住所`,
                  CONCAT(LEFT(`住所`,INSTR(`住所`, '道')-1), '道')
                )
              ),
              CONCAT(LEFT(`住所`,INSTR(`住所`, '都')-1), '都')
            )
          ),
            CONCAT(LEFT(`住所`,INSTR(`住所`, '府')-1), '府')
        )
      ),
      CONCAT(LEFT(`住所`,INSTR(`住所`, '県')-1), '県')
    ) AS `住所`
    FROM `address`
    
[/code]




MySQL 8.0
以降であれば、[`REGEXP_SUBSTR`](https://dev.mysql.com/doc/refman/8.0/ja/regexp.html#function_regexp-
substr)で抽出できます。

[code]

    REGEXP_SUBSTR(`住所`, '^.{2,3}?[都道府県]')
    
[/code]

正規表現が使えない場合は`case`文の使用をご検討ください。(下記のQuery #1を参照)

**Schema (MySQL v8.0)**

[code]

    create table address (`住所` varchar(50)) CHARSET "utf8mb4";
    insert into address values('京都府宇治市莵道');
    insert into address values('大阪府○○○○');
    insert into address values('東京都府中市');
    insert into address values('長野県小県郡');
    insert into address values('北海道○○○○');
    insert into address values('沖縄県○○○○');
    insert into address values('和歌山県○○○○');
    insert into address values('神奈川県○○○○');
    
[/code]

* * *

**Query #1**

[code]

    select REGEXP_SUBSTR(`住所`, '^.{2,3}?[都道府県]') REG_SUBSTR,
           case when SUBSTRING(`住所`, 3, 1) in ('都', '道', '府', '県')
                then SUBSTRING(`住所`, 1, 3)
                else SUBSTRING(`住所`, 1, 4)
           end substr_case
    from address;
    
[/code]

REG_SUBSTR | substr_case  
---|---  
京都府 | 京都府  
大阪府 | 大阪府  
東京都 | 東京都  
長野県 | 長野県  
北海道 | 北海道  
沖縄県 | 沖縄県  
和歌山県 | 和歌山県  
神奈川県 | 神奈川県  
  
* * *

[View on DB Fiddle](https://www.db-fiddle.com/f/dgPj6t5dqxNst8m28RXYeY/2)

