El análisis de cadenas en SQL es desordenado y tiende a ser frágil. Por lo general, creo que es mejor hacer este tipo de tareas fuera de SQL por completo. Dicho esto, dada la mini-especificación anterior, es posible analizar los datos en los campos que desee de la siguiente manera:
select
left(PostalAddress, charindex('^', PostalAddress) - 1) as street_address,
left(second_part, len(second_part) - charindex(' ', reverse(second_part))) as suburb,
right(second_part, charindex(' ', reverse(second_part))) as state,
reverse(substring(reverse(PostalAddress), 2, 4)) as postal_code
from (
select
PostalAddress,
rtrim(reverse(substring(reverse(PostalAddress), 6, len(PostalAddress) - charindex('^', PostalAddress) - 5))) as second_part
from Addresses
) as t1
Tenga en cuenta que deberá sustituir el nombre de su tabla por lo que he llamado direcciones en la subconsulta anterior.
Puede ver esto en acción contra sus datos de muestra aquí .