복붙노트

[SQL] SQL에서 처음 2 특수 문자 사이의 문자를 가져옵니다

SQL

SQL에서 처음 2 특수 문자 사이의 문자를 가져옵니다

나는 SQL에서 (그냥 참고 : SQL 스튜디오는 IDE입니다) 데이터가 같은 :

data
a_10_b_c
a_1_b_c

내가 처음 두 문자 사이의 데이터를 얻으려면 _ :

Output
10
1

해결법

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

    1.이건 내 방법이 될 것입니다 :

    이건 내 방법이 될 것입니다 :

    SELECT CAST('<x>' + REPLACE(data,'_','</x><x>') + '</x>' AS XML).value('/x[2]','int')
    FROM YourTable
    

    먼저 당신은 XML이 변환 한 다음 두 번째 노드를 선택 ..

    편집 :이 방법이 유용합니다 몇 가지 더 많은 예제 :

    CROSS이 적용됩니다 : 당신은 한 번에 여러 개의 토큰을 얻기 위해이 방법을 사용할 수 있습니다

    DECLARE @tbl TABLE(separated VARCHAR(100));
    INSERT INTO @tbl VALUES('1_23:50_Look_this_is_a_test'),('2_12:00_that''s_one_more_test'),('3_13:30_great!_It_works!');
    
    SELECT Converted.value('/x[1]','int') AS number
          ,Converted.value('/x[2]','time') AS time
          ,Converted.value('/x[3]','varchar(max)') AS text
    FROM @tbl
    CROSS APPLY(SELECT CAST('<x>' + REPLACE(separated,'_','</x><x>') + '</x>' AS XML) AS Converted) AS MySeparated
    --type-safe and easy:
    /*
    number  time    text
    1       23:50   Look
    2       12:00   that's
    3       13:30   great!
    */
    GO
    

    CTE : 매개 변수로 사용

    DECLARE @Parameter VARCHAR(100)='1_12:30_SomeValue';
    WITH MyParameters AS
    (
        SELECT CAST('<x>' + REPLACE(@Parameter,'_','</x><x>') + '</x>' AS XML).value('/x[1]','int') AS IntParam
              ,CAST('<x>' + REPLACE(@Parameter,'_','</x><x>') + '</x>' AS XML).value('/x[2]','time') AS TimeParam
              ,CAST('<x>' + REPLACE(@Parameter,'_','</x><x>') + '</x>' AS XML).value('/x[3]','varchar(max)') AS TextParam
    )
    SELECT IntParam,TimeParam,TextParam
    FROM MyParameters
    /*
    IntParam    TimeParam   TextParam
    1           12:30:00    SomeValue
    */
    GO
    

    분할 문자열 : 목록에 변환

    DECLARE @MyIDs VARCHAR(100)='3,5,7';
    SELECT A.B.value('.','int') TheIntValue
    FROM(SELECT CAST('<x>' + REPLACE(@MyIDs,',','</x><x>') + '</x>' AS XML) AS MyListAsXML) AS x
    CROSS APPLY MyListAsXML.nodes('/x') AS A(B)
    
    /*
    TheIntValue
    3
    5
    7
    */
    GO
    

    동적 IN 문

    DECLARE @tbl TABLE(ID INT,Content VARCHAR(max));
    INSERT INTO @tbl VALUES(1,'Value 1'),(2,'Value 2'),(3,'Value 3'),(4,'Value 4'),(5,'Value 5'),(6,'Value 6'),(7,'Value 7');
    
    DECLARE @MyIDs VARCHAR(100)='3,5,7';
    /*
    This won't work (due to the fact, that @MyIDs is not a list of INTs but a text
    SELECT * FROM @tbl WHERE ID IN(@MyIDs)
    */
    WITH AsList AS
    (
        SELECT A.B.value('.','int') TheIntValue
        FROM(SELECT CAST('<x>' + REPLACE(@MyIDs,',','</x><x>') + '</x>' AS XML) AS MyListAsXML) AS x
        CROSS APPLY MyListAsXML.nodes('/x') AS A(B)
    
    )
    SELECT * FROM @tbl WHERE ID IN(SELECT TheIntValue FROM AsList)
    
    /*
    ID  Content
    3   Value 3
    5   Value 5
    7   Value 7
    */
    
  2. ==============================

    2.당신은 중첩 된 문자열 함수와 함께이 작업을 수행 할 수 있습니다. 종종이 적용 외부를 사용하여 간단하다 :

    당신은 중첩 된 문자열 함수와 함께이 작업을 수행 할 수 있습니다. 종종이 적용 외부를 사용하여 간단하다 :

    select t3.output
    from t outer apply
         (select stuff(t.col, 1, charindex('_', t.col), '') as col2
         ) t2 outer apply
         (select left(t2.col2, charindex('_', t2.col2)) as output
         ) t3;
    
  3. from https://stackoverflow.com/questions/33657835/get-the-character-between-first-2-special-character-in-sql by cc-by-sa and MIT license