2016-10-12 3 views
1

が、私はこのような単一の列に格納されたアドレスのデータを持っている:SQLクエリ

123 Fake St #25 

を私は、このデータにこのような3つの列を分離したいと思います:

Number Street  Apt 
----------------------- 
123  Fake St #25 

トリミング機能と検索機能を組み合わせて使うことができますが、わかりません。私は助けに感謝します。

+2

アドレスのようにそれを使用してのようなスカラー値を返すように関数を作成します。 NumberとAptを分割する価値は何ですか? –

答えて

2

唯一のヒントは、開始から最初の空白、最後から最初の空白です。しかし、 - 確かに! - それにもかかわらずで開始するには、何かこのパターンを気力ないアドレス...

があるでしょう:アドレスはあなたの例のように同様のパターンを持っているだろうと仮定すると

DECLARE @addr VARCHAR(100)='123 Fake St #25'; 

WITH Blanks AS 
(
    SELECT @addr AS Addr 
      ,CHARINDEX(' ',@addr) AS FirstBlank 
      ,CHARINDEX(' ',REVERSE(@addr)) AS LastBlankFromBack 
) 
SELECT LTRIM(RTRIM(LEFT(Addr,FirstBlank-1))) AS Number 
     ,LTRIM(RTRIM(SUBSTRING(Addr,FirstBlank+1,LEN(Addr)-FirstBlank-LastBlankFromBack+1))) AS Street 
     ,LTRIM(RTRIM(RIGHT(Addr,LastBlankFromBack-1))) AS Apt 
FROM Blanks 
0

、あなたは次のことを試してください。

...すでに区切り文字が知られていない場合は、正確な解を得ることはできません述べたように、

 CREATE FUNCTION [dbo].[SplitGet] (
      @test AS VARCHAR(255) 
      ,@field AS VARCHAR(1) 
      ) 
     RETURNS VARCHAR(255) 
     AS 
     BEGIN 
      DECLARE @ReturnValue VARCHAR(255) = ''; 
      DECLARE @Alpha VARCHAR(255) = ''; 
      DECLARE @Beta VARCHAR(255) = ''; 
      DECLARE @Gamma VARCHAR(255) = ''; 
      DECLARE @ind INT = 1; 
      WHILE (@ind < LEN(@test)) 
      BEGIN 
       IF (ISNUMERIC(substring(@test, @ind, 1)) = 1) 
       BEGIN 
        SET @Alpha = @Alpha + cast(substring(@test, @ind, 1) AS NVARCHAR(1)); 
        SET @ind = @ind + 1; 
       END 
       ELSE 
       BEGIN 
        BREAK; 
       END 
      END 

      SET @Beta = Substring(Substring(@test, @ind, len(@test)), 0, charindex('#', Substring(@test, @ind, len(@test)), 0)) 
      SET @Gamma = RTRIM(substring(@test, charindex('#', @test, 0), len(@test))); 

      IF (@field = 'n') --Numnber 
      BEGIN 
       SET @ReturnValue = @Alpha; 
      END 
      ELSE IF (@field = 'a') --Address 
      BEGIN 
       SET @ReturnValue = @Beta; 
      END 
      ELSE 
      BEGIN --Apartment 
       SET @ReturnValue = @gamma; 
      END 

      RETURN RTRIM(@ReturnValue) 
     END 

は注意が必要です

DECLARE @test varchar(255) = '123 Fake st #25' 
SELECT dbo.[SplitGet](@test,'n'),dbo.[SplitGet](@test,'a'),dbo.[SplitGet](@test,'')