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

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

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

```

    SELECT SUBSTRING(`住所`,1,3) FROM address
    
```

元データ

```

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

出力

```

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

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

```

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

ご教授いただけると幸いです。
CC BY-SA 4.0
2022-09-12T01:23:17.677
91044
2022-09-13T00:39:28.657
2022-09-12T02:39:53.817
3060
18859
question
mysql
MySQLで住所（都道府県）を分ける（分割する）方法
MySQL 8.0
以降であれば、[`REGEXP_SUBSTR`](https://dev.mysql.com/doc/refman/8.0/ja/regexp.html#function_regexp-
substr)で抽出できます。

```

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

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

**Schema (MySQL v8.0)**

```

    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('神奈川県○○○○');
    
```

* * *

**Query #1**

```

    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;
    
```

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

[View on DB Fiddle](https://www.db-fiddle.com/f/dgPj6t5dqxNst8m28RXYeY/2)
CC BY-SA 4.0
2022-09-12T02:05:05.977
91045
2022-09-12T03:52:02.620
2022-09-12T03:52:02.620
9820
9820
91044
answer
REGEXP_SUBSTRとREGEXP_REPLACEを使えない場合(MySQL 5.6 or 5.7)、下記のクエリをたみしてみてください。

```

    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`
    
```
CC BY-SA 4.0
2022-09-12T02:53:54.280
91047
2022-09-13T00:39:28.657
2022-09-13T00:39:28.657
40476
40476
91044
answer
別解です。

```

    SELECT SUBSTR(住所, 1, 4) '住所' FROM address WHERE SUBSTR(住所, 4, 1) = '県' UNION
    SELECT SUBSTR(住所, 1, 3) '住所' FROM address WHERE SUBSTR(住所, 3, 1) IN ('都', '道', '府', '県');
    
```

実行例

```

    WITH address(住所) AS (
    select '愛知県○○○○' union
    select '愛媛県○○○○' union
    select '茨城県○○○○' union
    select '岡山県○○○○' union
    select '沖縄県○○○○' union
    select '岩手県○○○○' union
    select '岐阜県○○○○' union
    select '宮崎県○○○○' union
    select '宮城県○○○○' union
    select '京都府○○○○' union
    select '熊本県○○○○' union
    select '群馬県○○○○' union
    select '広島県○○○○' union
    select '香川県○○○○' union
    select '高知県○○○○' union
    select '佐賀県○○○○' union
    select '埼玉県○○○○' union
    select '三重県○○○○' union
    select '山形県○○○○' union
    select '山口県○○○○' union
    select '山梨県都留市○' union
    select '滋賀県○○○○' union
    select '鹿児島県○○○○' union
    select '秋田県○○○○' union
    select '新潟県○○○○' union
    select '神奈川県○○○○' union
    select '青森県○○○○' union
    select '静岡県○○○○' union
    select '石川県○○○○' union
    select '千葉県○○○○' union
    select '大阪府○○○○' union
    select '大分県○○○○' union
    select '長崎県○○○○' union
    select '長野県○○○○' union
    select '鳥取県○○○○' union
    select '島根県○○○○' union
    select '東京都○○○○' union
    select '徳島県○○○○' union
    select '栃木県○○○○' union
    select '奈良県○○○○' union
    select '富山県○○○○' union
    select '福井県○○○○' union
    select '福岡県○○○○' union
    select '福島県○○○○' union
    select '兵庫県○○○○' union
    select '北海道○○○○' union
    select '和歌山県○○○○'
    )
    SELECT SUBSTR(住所, 1, 4) '住所' FROM address WHERE SUBSTR(住所, 4, 1) = '県' UNION
    SELECT SUBSTR(住所, 1, 3) '住所' FROM address WHERE SUBSTR(住所, 3, 1) IN ('都', '道', '府', '県');
    
```

```

    +--------------+
    | 住所         |
    +--------------+
    | 鹿児島県     |
    | 神奈川県     |
    | 和歌山県     |
    | 愛知県       |
    | 愛媛県       |
    | 茨城県       |
    | 岡山県       |
    | 沖縄県       |
    | 岩手県       |
    | 岐阜県       |
    | 宮崎県       |
    | 宮城県       |
    | 京都府       |
    | 熊本県       |
    | 群馬県       |
    | 広島県       |
    | 香川県       |
    | 高知県       |
    | 佐賀県       |
    | 埼玉県       |
    | 三重県       |
    | 山形県       |
    | 山口県       |
    | 山梨県       |
    | 滋賀県       |
    | 秋田県       |
    | 新潟県       |
    | 青森県       |
    | 静岡県       |
    | 石川県       |
    | 千葉県       |
    | 大阪府       |
    | 大分県       |
    | 長崎県       |
    | 長野県       |
    | 鳥取県       |
    | 島根県       |
    | 東京都       |
    | 徳島県       |
    | 栃木県       |
    | 奈良県       |
    | 富山県       |
    | 福井県       |
    | 福岡県       |
    | 福島県       |
    | 兵庫県       |
    | 北海道       |
    +--------------+
    47 rows in set (0.003 sec)
    
```
CC BY-SA 4.0
2022-09-12T08:48:01.413
91056
2022-09-12T08:48:01.413
35558
91044
answer