복붙노트

[SQL] 어떻게 분할 문자열에 문자로 SQL 서버에서 별도의 컬럼에

SQL

어떻게 분할 문자열에 문자로 SQL 서버에서 별도의 컬럼에

I 부, 향 및 범위 정보를 포함하는 SQL 서버에 하나 개의 필드가, 대시로 구분; 18-84-7 예를 들면 다음과 같습니다. 18 84 7 : I처럼 한 필드로 하나 개의 필드 및 범위 등이 각 부에 의해 분류 된 정보는, 하나 개의 필드로서 섹션을 향하고자.

문자의 수는 다양합니다. 내가 가장 좋은 방법은 대시로 분리하는 것입니다 생각, 그래서 그것은 항상 2 개 문자 또는 단위 당 1 개 캐릭터 아니지만, 나는 확실히이 작업을 수행하는 방법을 모르겠어요. 이 SQL 서버에서 수행 할 수 있습니다 할 수있는 방법이 있나요?

감사!

해결법

  1. ==============================

    1.그것을 할 수있는 여러 가지 방법으로, 다른 사람보다 좀 더 추악한 아마이 있습니다. 여기에 하나입니다 :

    그것을 할 수있는 여러 가지 방법으로, 다른 사람보다 좀 더 추악한 아마이 있습니다. 여기에 하나입니다 :

    (참고 : DAT는 문자의 문자열을 =)

    select *,
      substring(dat,1,charindex('-',dat)-1) as Section,
      substring(dat,charindex('-',dat)+1,charindex('-',dat)-1) as TownShip,
      reverse(substring(reverse(dat),0,charindex('-',reverse(dat)))) as myRange
    from myTable
    
  2. ==============================

    2.이 같은 것을 사용할 수 있습니다 (@canon에 의해 게시)

    이 같은 것을 사용할 수 있습니다 (@canon에 의해 게시)

    CREATE FUNCTION [dbo].[Split]
    (   
     @String varchar(max)
    ,@Delimiter char
    )
    RETURNS @Results table
    (
     Ordinal int
    ,StringValue varchar(max)
    )
    as
    begin
    
        set @String = isnull(@String,'')
        set @Delimiter = isnull(@Delimiter,'')
    
        declare
         @TempString varchar(max) = @String
        ,@Ordinal int = 0
        ,@CharIndex int = 0
    
        set @CharIndex = charindex(@Delimiter, @TempString)
        while @CharIndex != 0 begin     
            set @Ordinal += 1       
            insert @Results values
            (
             @Ordinal
            ,substring(@TempString, 0, @CharIndex)
            )       
            set @TempString = substring(@TempString, @CharIndex + 1, len(@TempString) - @CharIndex)     
            set @CharIndex = charindex(@Delimiter, @TempString)
        end
    
        if @TempString != '' begin
            set @Ordinal += 1 
            insert @Results values
            (
             @Ordinal
            ,@TempString
            )
        end
    
        return
    end
    

    더 T-SQL을 사용하여 구분 기호 문자를 사용하여 어떻게 분할 문자열을 살펴 하시나요?

  3. ==============================

    3.보다 안정적인 코드를 시도하십시오

    보다 안정적인 코드를 시도하십시오

    아래의 기능을 CREATE

    CREATE FUNCTION dbo.UFN_SEPARATES_COLUMNS(
     @TEXT      varchar(8000)
    ,@COLUMN    tinyint
    ,@SEPARATOR char(1)
    )RETURNS varchar(8000)
    AS
      BEGIN
           DECLARE @POS_START  int = 1
           DECLARE @POS_END    int = CHARINDEX(@SEPARATOR, @TEXT, @POS_START)
    
           WHILE (@COLUMN >1 AND @POS_END> 0)
             BEGIN
                 SET @POS_START = @POS_END + 1
                 SET @POS_END = CHARINDEX(@SEPARATOR, @TEXT, @POS_START)
                 SET @COLUMN = @COLUMN - 1
             END 
    
           IF @COLUMN > 1  SET @POS_START = LEN(@TEXT) + 1
           IF @POS_END = 0 SET @POS_END = LEN(@TEXT) + 1 
    
           RETURN SUBSTRING (@TEXT, @POS_START, @POS_END - @POS_START)
      END
    GO
    

    다음 코드 아래에 시도

    DECLARE @STRING VARCHAR(20) ='1-668-333'
    SELECT
      dbo.UFN_SEPARATES_COLUMNS(@STRING, 1, '-') AS VALUE1,
      dbo.UFN_SEPARATES_COLUMNS(@STRING, 2, '-') AS VALUE2,
      dbo.UFN_SEPARATES_COLUMNS(@STRING, 3, '-') AS VALUE3
    

    결과

    당신은 더 많은 이해 바랍니다 이동이 필요한 경우

  4. ==============================

    4.

    DROP PROCEDURE getName
    GO
    create proc getName as
    begin
    select * , substring(name, 1 , CHARINDEX(' ', name)-1) as 'First Name',
    SUBSTRING(name, CHARINDEX(' ', name)+1, len(name)) as 'Last Name' 
    from Employee 
    order by [Last Name]
    end
    go
    exec getName
    
  5. ==============================

    5.그것의 더 나은이 하나 BWS 응답 두 번째 섹션을 대체 :

    그것의 더 나은이 하나 BWS 응답 두 번째 섹션을 대체 :

    select SUBSTRING(dat,CHARINDEX('-', dat) + 1,LEN(dat) - CHARINDEX('-', dat) - CHARINDEX('-', REVERSE(dat)) ) from myTable.
    
  6. from https://stackoverflow.com/questions/21991953/how-to-split-string-by-character-into-separate-columns-in-sql-server by cc-by-sa and MIT license