Разобрать 1 столбец на 3 столбца с помощью DB2 SQL - PullRequest
0 голосов
/ 01 июня 2019

Используя DB2 для z / OS 10, у меня есть столбец (ADDRESS3) в таблице, который содержит город, штат и почтовый индекс в одном столбце.Но форматирование несколько «в свободной форме».(см. код ниже)

Я могу успешно разобрать город, взяв все до запятой.Используя только DB2 SQL, как бы я проанализировал состояние и почтовый индекс?

SELECT ADDRESS3,
       TRIM(SUBSTR(ADDRESS3,1,LOCATE(',', ADDRESS3)-1)) AS CITY
  FROM MYTABLE

ADDRESS3                            CITY         
----------------------------------  -------------
GRANADA HILLS       ,CA 91344       GRANADA HILLS
SIMI VALLEY         ,CA 93065       SIMI VALLEY  
BUENA PARK          ,CA 90621       BUENA PARK   
SHERMAN OAKS        ,CA 91423       SHERMAN OAKS 
GLENDALE            ,CA 91203-2089  GLENDALE     
VENTURA             ,CA 93002       VENTURA      
HAWTHORNE           ,CA 90250       HAWTHORNE    
PASADENA            ,CA 91185-2594  PASADENA     
BEVERLY HILLS       ,CA 90211       BEVERLY HILLS
ARCADIA             ,CA 91007       ARCADIA      
WALNUT CREEK        ,CA 94596       WALNUT CREEK 
INDEPENDANCE        ,CA 93526       INDEPENDANCE 
LOS ANGELES         ,CA 90017       LOS ANGELES  

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

CITY          STATE ZIP
------------- ----- -----
GRANADA HILLS CA    91344
SIMI VALLEY   CA    93065
BUENA PARK    CA    90621
SHERMAN OAKS  CA    91423
GLENDALE      CA    91203
VENTURA       CA    93002
HAWTHORNE     CA    90250
PASADENA      CA    91185
...

Спасибо!

Ответы [ 3 ]

1 голос
/ 01 июня 2019

Я думаю, что вам это нужно, при условии, что формат всегда один и тот же.

  SELECT 
       TRIM(
         SUBSTR(
           SUBSTR(MYTABLE.A, LOCATE(',', MYTABLE.A) + 1)
           , 1
           , POSITION(' ' , SUBSTR(MYTABLE.A, LOCATE(',', MYTABLE.A) + 1))
         )
       ) AS STATE
    ,  TRIM(
           SUBSTR(
             SUBSTR(MYTABLE.A, LOCATE(',', MYTABLE.A) + 1)
           , POSITION(' ' , SUBSTR(MYTABLE.A, LOCATE(',', MYTABLE.A) + 1))
         ) 
       ) AS ZIP
  FROM MYTABLE

Демонстрационный результат для этих результатов со следующими значениями

Данные испытаний

  VALUES
    ('GRANADA HILLS       ,CA 91344')
  , ('SIMI VALLEY         ,CA 93065') 
  , ('GLENDALE            ,CA 91203-2089')
  , ('SIMI VALLEY         ,CA    93065')  
  , ('SIMI VALLEY         ,CA    93065') 
  , ('GLENDALE            ,CA    91203-2089') 

Результаты

STATE   ZIP
CA      91344
CA      93065
CA      91203-2089
CA      93065
CA      93065
CA      91203-2089

см. демо

1 голос
/ 01 июня 2019

На основе вашего кода, если состояние 2 символа и почтовый индекс 5 символов:

SELECT 
  ADDRESS3,
  TRIM(SUBSTR(ADDRESS3, 1, LOCATE(',', ADDRESS3)-1)) AS CITY,
  TRIM(SUBSTR(ADDRESS3, LOCATE(',', ADDRESS3) + 1), 2) AS STATE,
  TRIM(SUBSTR(ADDRESS3, LOCATE(',', ADDRESS3) + 4), 5) AS ZIP
FROM MYTABLE
0 голосов
/ 03 июня 2019

интересно, это тоже сработало.

SELECT TRIM(SUBSTR(ADDRESS3, 1, locate(',', ADDRESS3) - 1)) AS city,
       SUBSTR(TRIM(SUBSTR(ADDRESS3, locate(',', ADDRESS3) + 1)), 1, 2) state,
       SUBSTR(TRIM(SUBSTR(TRIM(SUBSTR(ADDRESS3, locate(',', ADDRESS3) + 1)), 3)), 1, 5) zip
  FROM MyTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...