Strängtolkning i SQL är rörig och tenderar att vara spröd. Jag tycker vanligtvis att det är bäst att göra den här typen av uppgifter utanför SQL helt och hållet. Som sagt, med tanke på mini-specifikationen ovan, är det möjligt att analysera data i de fält du vill ha så här:
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
Observera att du måste ersätta ditt tabellnamn med det jag har kallat adresser i underfrågan ovan.
Du kan se detta i aktion mot dina exempeldata här .