복붙노트

[SQL] 어떻게 SQLite는 쉼표로 구분 된 값을 분할하려면?

SQL

어떻게 SQLite는 쉼표로 구분 된 값을 분할하려면?

내가 분할 할 SQLite 데이터베이스의 내부 문자열을 쉼표로 구분

예 : 내 테이블의 1에 범주 열을 가지고있다.

|Category                      |
|------------------------------|
|Auto,A,1234444                |
|Auto,B,2345444                |
|Electronincs,Computer,33443434|

나는 위의 문자열에서 단 하나의 가치를 얻을 싶어요.

value1: Auto
value2: A
value3: 1234444

나는 Google에서 많이 검색 한; 나는 ()와 트림 ()를 교체 사용하여 쉼표를 대체 할 수있는 방법을 발견했다. 그러나, 나는 쉽게 접근 싶어.

SQL에서 문자열을 제공하는이 (). 하지만 SQLite는에 그런 기능이 없다. 어떻게 그것을 해결하기 위해?

편집 : 나는 SUBSTR을 확인했다 (). 그러나,이 함수는 문자열 값을 얻을 수있는 세트 최대 길이 될 수 있으며, 내 문자열 값은 고정 된 길이가 없습니다.

해결법

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

    1.당신이 sqlite에서이 기능을 만드십시오 먼저 분리하고 두 번째 문자열이 개 인수를 전달합니다.

    당신이 sqlite에서이 기능을 만드십시오 먼저 분리하고 두 번째 문자열이 개 인수를 전달합니다.

    CREATE FUNCTION [dbo].[Split]
    (   
          @Sep char(1)
        , @S varchar(512)
    )
    RETURNS TABLE 
    AS
    RETURN 
    (
        WITH Pieces(pn, start, stop) AS (
          SELECT 1, 1, CHARINDEX(@Sep, @S)
          UNION ALL
          SELECT pn + 1, stop + 1, CHARINDEX(@Sep, @S, stop + 1)
          FROM Pieces
          WHERE stop > 0
        )
        SELECT pn,
          SUBSTR(@S, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS S
        FROM Pieces
    )
    
  2. ==============================

    2.분할 쉼표 SQLite는 값을 분리하는 방법은 공통 테이블 표현식을 사용할 수 있습니다.

    분할 쉼표 SQLite는 값을 분리하는 방법은 공통 테이블 표현식을 사용할 수 있습니다.

    WITH split(word, str) AS (
        -- alternatively put your query here
        -- SELECT '', category||',' FROM categories
        SELECT '', 'Auto,A,1234444'||','
        UNION ALL SELECT
        substr(str, 0, instr(str, ',')),
        substr(str, instr(str, ',')+1)
        FROM split WHERE str!=''
    ) SELECT word FROM split WHERE word!='';
    

    출력은 다음과 같이 예상됩니다 :

    Auto
    A
    1234444
    
  3. ==============================

    3.@ user1461607에서 제공하는 답변이 변화 일이 어떤 CSV 값이 빈 문자열이 보존 될 것을 보장한다 :

    @ user1461607에서 제공하는 답변이 변화 일이 어떤 CSV 값이 빈 문자열이 보존 될 것을 보장한다 :

    WITH RECURSIVE split(value, str) AS (
          SELECT null, 'Auto,A,1234444' || ','  -- the string to be split 
          UNION ALL
          SELECT
          substr(str, 0, instr(str, ',')),
          substr(str, instr(str, ',')+1)
          FROM split WHERE str!=''
      ) SELECT value FROM split WHERE value is not NULL;
    

    JSON1 확장이로드 된 가정하면, 변환 할 수있는 마지막 줄에 json_group_array (값)를 사용할 수 있습니다 문자열 JSON 배열에 CSV.

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

    4.나는 제외 @ user1461607에서 대답처럼 : SQLite는 문서는 일반적인 경우에 SELECT, 모두에서 특정 순서를 가정에 대해 경고하고, 재귀 SELECT의 특정 케이스에 나에게 보인다. 자, 내가 대답은 내가 작업에 SQLite는 보장을 생각하는 방식으로 순서 열을 추가하는 것을 수정했습니다.

    나는 제외 @ user1461607에서 대답처럼 : SQLite는 문서는 일반적인 경우에 SELECT, 모두에서 특정 순서를 가정에 대해 경고하고, 재귀 SELECT의 특정 케이스에 나에게 보인다. 자, 내가 대답은 내가 작업에 SQLite는 보장을 생각하는 방식으로 순서 열을 추가하는 것을 수정했습니다.

    또한 미용 당신이 정말로 특정 순서로 처리 일에 필요한 경우가 제안하는 경로에 쉼표로 구분 된 목록에서 예를 변경. 그것은 무슨 일이 있었는지 볼이 약간 쉽게 그래서이 예제는 임시 테이블에서 모든 열을 출력합니다. 이 밤에 숙면에 자신이 정말로 필요 일부 순서 열을 추가하는 것 같아 그래서 AFAICT은, SQLite는의 CTE는 보통 ROWID 열이 없습니다.

    WITH RECURSIVE split(seq, word, str) AS (
        SELECT 0, '/', 'home/ronburk/layers/branch'||'/'
        UNION ALL SELECT
            seq+1,
            substr(str, 0, instr(str, '/')),
            substr(str, instr(str, '/')+1)
        FROM split WHERE str != ''
    ) SELECT * FROM split ORDER BY split.seq ASC;
    
  5. from https://stackoverflow.com/questions/24258878/how-to-split-comma-separated-value-in-sqlite by cc-by-sa and MIT license