2009-06-26 7 views
1

Je souhaite diviser une colonne en 4 colonnes en fonction de la colonne.Comment séparer une chaîne d'adresse dans T-SQL?

Ex: valeur de la colonne comprend 'CITY_NAME', 'Etat', NPA », 'Pays'

Je veux diviser en 4 différentes colonnes comme City_Name, State, Zipcode, Country.

Comment puis-je faire cela en utilisant T-SQL?

+0

Quelle version de SQL Server utilisez-vous? En outre, veuillez utiliser un titre plus descriptif: quelque chose comme "Comment diviser une chaîne d'adresse en T-SQL"? –

+0

Veuillez fournir un exemple de ce à quoi ressemble la colonne source. Le formatage exact est important. – beach

+0

Merci pour la réponse ... J'utilise SQL Sever 2005 ... Colonne source Nom est Détails et la valeur est 'Delhi, Delhi, 34567, IND' Maintenant le o/p devrait ressembler Ville_Name État Code postal Pays -------------------------------------- Delhi Delhi 34567 IND –

Répondre

0

Si vous avez des séparateurs évidents dans votre colonne d'origine, vous pouvez écrire une fonction définie par l'utilisateur ou utiliser une expression rationnelle en ligne pour extraire vos données en 4 colonnes. Comment vous faites cela dépend:

  • vos données et en particulier la façon dont il est homogène
  • votre SGBDR

Vous voudrez peut-être pour nous laisser voir quelques exemples de données pour plus d'informations.

0

étape 1: créez les quatre nouvelles colonnes dans votre table de base de données. puisque vous ajoutez de nouvelles colonnes à une table existante, elles doivent avoir des valeurs par défaut (par exemple, la chaîne vide)

étape 2: exécutez une requête de mise à jour qui met à jour vos quatre nouvelles colonnes en fonction de votre ancienne colonne. Utilisez les fonctions de chaîne SQL pour le faire (peut les chercher dans la référence, par exemple, SUBSTRING)

étape 3: laisser tomber l'ancienne colonne

+0

Merci pour la réponse .. .Puisque j'utilise à la fois SUBSTRING et CHARIINDEX Mais je suis capable de le diviser en deux colonnes l'exemple de requête qui fonctionne est ressemble à SELECT SUBSTRING (CITY, 1, CHARINDEX (',', CITY)) COMME CITY_NAME FROM TABLE_NAME Cela donnera comme seul nom de la ville .. j'ai besoin pour le reste des autres colonnes aussi Merci à l'avance –

0

Créer une nouvelle table avec les champs souhaités. Parcourez les enregistrements de la table d'origine et divisez la valeur dans cette colonne par le délimiteur. Pour le fractionnement, vous pouvez utiliser charindex, sous-chaîne et d'autres fonctions de manipulation de chaînes. Vous pouvez coder cette logique dans un SP ou une fonction.

7

supposant que vous avez toujours 3 virgules dans cette colonne, vous pouvez utiliser la fonction PARSENAME

create table #test(Col varchar(100)) 
insert #test values('City_Name,State,Zipcode,Country') 
insert #test values('New York City,NJ,10028,United States') 


select parsename(replace(Col,',','.'),4) as City_Name, 
parsename(replace(Col,',','.'),3) as State, 
parsename(replace(Col,',','.'),2) as Zipcode, 
parsename(replace(Col,',','.'),1) as Country 
from #test 

sortie

City_Name State Zipcode Country 
New York City NJ 10028 United States 
+0

Merci beaucoup beaucoup ... il est vraiment utile pour moi –

+0

pourquoi ne pas accepter son ansewr alors? –

0

Testé avec votre chaîne exemple:

CREATE FUNCTION fn_PARM (@Parm nvarchar(2000)) 
RETURNS @TParm TABLE (City_Name nvarchar(100),State nvarchar(100),Zipcode nvarchar(100),Country nvarchar(100)) 
AS 
BEGIN 

DECLARE @City_Name nvarchar(100) 
    ,@State nvarchar(100) 
    ,@Zipcode nvarchar(100) 
    ,@Country nvarchar(100) 
    ,@CommaPosition1 tinyint 
    ,@CommaPosition2 tinyint 

    SELECT @CommaPosition1 = charindex(',',@Parm) 
    IF (@CommaPosition1>0) 
    BEGIN 
     SELECT @City_Name = ltrim(rtrim(SUBSTRING(@Parm,1,@CommaPosition1 - 1))) 
     SELECT @CommaPosition2 = @CommaPosition1 + 1 

     SELECT @CommaPosition1 = charindex(',',@Parm,@CommaPosition2) 
     IF (@CommaPosition1>0) 
     BEGIN 
      SELECT @State = ltrim(rtrim(SUBSTRING(@Parm,@CommaPosition2 + 1,@CommaPosition1 - (@CommaPosition2 + 1)))) 
      SELECT @CommaPosition2 = @CommaPosition1 + 1 

      SELECT @CommaPosition1 = charindex(',',@Parm,@CommaPosition2) 
      IF (@CommaPosition1>0) 
      BEGIN 
       SELECT @Zipcode = ltrim(rtrim(SUBSTRING(@Parm,@CommaPosition2 + 1,@CommaPosition1 - (@CommaPosition2 + 1)))) 
       SELECT @Country = ltrim(rtrim(SUBSTRING(@Parm,@CommaPosition1 + 1,LEN(@Parm)))) 
      END 
     END 
    END 

    INSERT INTO @TParm (City_Name, State, Zipcode,Country) 
     VALUES (@City_Name, @State, @Zipcode, @Country) 

    RETURN 
END 
GO 

Utilisation simple:

select * from fn_PARM('Delhi , Delhi ,34567 ,IND') 

Pour une utilisation dans une requête, voir This MSDN article à propos de l'utilisation de APPLY.

Questions connexes