Разделить город, штат и почтовый индекс для всех стран

#sql #snowflake-cloud-data-platform

#sql #snowflake-cloud-data-platform

Вопрос:

Вероятно, это распространенная проблема, которая решалась довольно много раз в прошлом, но я не смог найти решение для ее реализации в Snowflake и для нескольких стран. Итак, разместите его здесь для экспертного руководства.

Поскольку мои данные включают несколько стран, я хотел бы проанализировать их соответствующим образом. Вот некоторые примеры данных.

 CITY_STATE_ZIP 
ANN ARBOR, MI 48104-4000 
Zürich, ZH 8004 
San Diego, CA 92127 
Toronto, ON M5C 3G7
 

Ответ №1:

Ваш «почтовый индекс» отображается как последний элемент, разделенный пробелом в city_state_zip столбце. Если это так:

 select regexp_substr(city_state_zip, '[^ ] 

Вы можете быть немного более четкими в отношении разделяющего пространства, если хотите:

 select regexp_substr(city_state_zip, ' ([^ ] )

Вы можете распространить это на все после запятой, кроме первой части:

 select regexp_replace(city_state_zip, '.*, [^ ]  (. )

Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.



Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ',', 0), split_part(CITY_STATE_ZIP, ',', -1), regexp_substr(city_state_zip, ' ([^ ] )$')

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.

 SELECT  CITY_STATE_ZIP,
        SPLIT_PART(CITY_STATE_ZIP, ',', 0)                              AS CITY,
        SUBSTRING(SPLIT_PART(TRIM(CITY_STATE_ZIP), ',',  -1), 1, 3)     AS STATE,
        regexp_replace(city_state_zip, '.*, [^ ]  (. )



)
Вы можете быть немного более четкими в отношении разделяющего пространства, если хотите:


Вы можете распространить это на все после запятой, кроме первой части:


Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.

Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ',', 0), split_part(CITY_STATE_ZIP, ',', -1), regexp_substr(city_state_zip, ' ([^ ] )$')

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.


)

Вы можете распространить это на все после запятой, кроме первой части:


Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.

Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ',', 0), split_part(CITY_STATE_ZIP, ',', -1), regexp_substr(city_state_zip, ' ([^ ] )$')

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.


)

Вы можете быть немного более четкими в отношении разделяющего пространства, если хотите:


Вы можете распространить это на все после запятой, кроме первой части:


Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.

Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ',', 0), split_part(CITY_STATE_ZIP, ',', -1), regexp_substr(city_state_zip, ' ([^ ] )$')

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.


, '1')
Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.

Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ‘,’, 0), split_part(CITY_STATE_ZIP, ‘,’, -1), regexp_substr(city_state_zip, ‘ ([^ ] )$’)

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.


)

Вы можете быть немного более четкими в отношении разделяющего пространства, если хотите:


Вы можете распространить это на все после запятой, кроме первой части:


Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.

Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ‘,’, 0), split_part(CITY_STATE_ZIP, ‘,’, -1), regexp_substr(city_state_zip, ‘ ([^ ] )$’)

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.


)Вы можете распространить это на все после запятой, кроме первой части:


Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.

Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ‘,’, 0), split_part(CITY_STATE_ZIP, ‘,’, -1), regexp_substr(city_state_zip, ‘ ([^ ] )$’)

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.


)Вы можете быть немного более четкими в отношении разделяющего пространства, если хотите:


Вы можете распространить это на все после запятой, кроме первой части:


Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.

Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ‘,’, 0), split_part(CITY_STATE_ZIP, ‘,’, -1), regexp_substr(city_state_zip, ‘ ([^ ] )$’)

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.


, ‘\1’) AS ZIP
FROM foo

)

Вы можете быть немного более четкими в отношении разделяющего пространства, если хотите:


Вы можете распространить это на все после запятой, кроме первой части:


Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.

Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ‘,’, 0), split_part(CITY_STATE_ZIP, ‘,’, -1), regexp_substr(city_state_zip, ‘ ([^ ] )$’)

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.


)Вы можете распространить это на все после запятой, кроме первой части:


Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.

Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ‘,’, 0), split_part(CITY_STATE_ZIP, ‘,’, -1), regexp_substr(city_state_zip, ‘ ([^ ] )$’)

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.


)Вы можете быть немного более четкими в отношении разделяющего пространства, если хотите:


Вы можете распространить это на все после запятой, кроме первой части:


Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.

Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ‘,’, 0), split_part(CITY_STATE_ZIP, ‘,’, -1), regexp_substr(city_state_zip, ‘ ([^ ] )$’)

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.


, ‘1’)

Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.

Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ‘,’, 0), split_part(CITY_STATE_ZIP, ‘,’, -1), regexp_substr(city_state_zip, ‘ ([^ ] )$’)

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.


)Вы можете быть немного более четкими в отношении разделяющего пространства, если хотите:


Вы можете распространить это на все после запятой, кроме первой части:


Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.

Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ‘,’, 0), split_part(CITY_STATE_ZIP, ‘,’, -1), regexp_substr(city_state_zip, ‘ ([^ ] )$’)

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.


)

Вы можете распространить это на все после запятой, кроме первой части:


Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.

Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ‘,’, 0), split_part(CITY_STATE_ZIP, ‘,’, -1), regexp_substr(city_state_zip, ‘ ([^ ] )$’)

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.


)

Вы можете быть немного более четкими в отношении разделяющего пространства, если хотите:


Вы можете распространить это на все после запятой, кроме первой части:


Вот db<>fiddle, который использует Oracle, который довольно близок к Snowflake по синтаксису для этой цели.

Комментарии:

1. Спасибо @Gordon! Как мне разделить здесь государственную часть? Я попробовал следующее, но это также дает мне почтовый индекс. ВЫБЕРИТЕ CITY_STATE_ZIP, split_part(CITY_STATE_ZIP, ‘,’, 0), split_part(CITY_STATE_ZIP, ‘,’, -1), regexp_substr(city_state_zip, ‘ ([^ ] )$’)

2. Кроме того, это не работает для канадских или некоторых европейских почтовых индексов, поскольку у них есть пробел в почтовых индексах.

3. Julaayi . , , я добавил еще одну альтернативу.

4. это все еще не работает для меня. Для почтовых индексов Канады / Европы он возвращает только последние три значения вместо 7 значений, включая пробел в почтовом индексе.

5. @Julaayi . , , Возможно, вам придется настроить третий аргумент, чтобы он был правильной обратной ссылкой для Snowflake. Например, это может потребовать '\1' .

Ответ №2:

Основываясь на предложении Гордона, я закончил с этой логикой для разделения на три столбца. Разместите его здесь, если это может помочь кому-то в будущем.