복붙노트

[SQL] 어떻게 분할 쉼표는 MySQL을 저장 프로 시저의 텍스트를 분리

SQL

어떻게 분할 쉼표는 MySQL을 저장 프로 시저의 텍스트를 분리

어떻게 분할 쉼표 문 "에서"SQL의 사용 결과에 MySQL을 저장 프로 시저의 텍스트 (ID의 목록을) 분리.

SELECT * FROM table WHERE table.id IN (splitStringFunction(commaSeparatedData, ','));

해결법

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

    1.당신은 두 가지 방법으로 할 수 있습니다 :

    당신은 두 가지 방법으로 할 수 있습니다 :

  2. ==============================

    2.이것은 MySQL을위한 지옥 간단하다 :

    이것은 MySQL을위한 지옥 간단하다 :

    SELECT * FROM table WHERE FIND_IN_SET(table.id, commaSeparatedData);
    

    참조 : http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

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

    3.이 작업을 달성하기 위해 저장 프로 시저 내부에 준비된 문을 사용할 수 있습니다. 당신은 IN 절에 쉼표로 구분 된 문자열에서 전체 선택 변수 내의 문자열로 쿼리를 다음 CONCATENATE을 만들 수 있습니다. 그럼 당신은 쿼리 문자열 변수에서 준비된 성명을 발표하고 실행할 수 있습니다.

    이 작업을 달성하기 위해 저장 프로 시저 내부에 준비된 문을 사용할 수 있습니다. 당신은 IN 절에 쉼표로 구분 된 문자열에서 전체 선택 변수 내의 문자열로 쿼리를 다음 CONCATENATE을 만들 수 있습니다. 그럼 당신은 쿼리 문자열 변수에서 준비된 성명을 발표하고 실행할 수 있습니다.

    DELIMITER ;;
    create procedure testProc(in listString varchar(255))
    
    BEGIN
    
    set @query = concat('select * from testTable where id in (',listString,');');
    prepare sql_query from @query;
    execute sql_query;
    
    END
    ;;
    
    DELIMITER ;
    
    call testProc("1,2,3");
    
  4. ==============================

    4.이 MySQL의 예를 시도 할 수 있습니다. 당신이 그것을 사용하기 전에,이 (즉, 체크 ID가 정수, 또는 삽입 전에 정규 표현식에 대해 일치)에 어떤 종류의 안전 검사를했습니다.

    이 MySQL의 예를 시도 할 수 있습니다. 당신이 그것을 사용하기 전에,이 (즉, 체크 ID가 정수, 또는 삽입 전에 정규 표현식에 대해 일치)에 어떤 종류의 안전 검사를했습니다.

     # BEGIN split statements ids
     DECLARE current_pos INT DEFAULT 1;
     DECLARE delim CHAR DEFAULT ',';
     DECLARE current CHAR DEFAULT '';
     DECLARE current_id VARCHAR(100) DEFAULT '';;
     CREATE TEMPORARY TABLE ids (`id` VARCHAR(100));
     split_ids: LOOP
      SET current = MID(statement_ids, current_pos, 1);
      IF (current_pos = LENGTH(statement_ids)) THEN
       IF current != delim THEN SET current_id = CONCAT(current_id,current); END IF;
       INSERT INTO ids(id) VALUES (current_id);
       LEAVE split_ids;
      END IF;
      IF current = delim THEN
       INSERT INTO ids(id) VALUES (current_id);
       SET current_id = '';
      ELSE
       SET current_id = CONCAT(current_id,current);
      END IF;
      SET current_pos = current_pos+1;
     END LOOP split_ids;
     # END split statement ids
    
     # to check ids are correct
     SELECT * FROM ids;
    
     # to use the ids:
     SELECT * FROM statements WHERE id IN (SELECT id FROM ids);
    
  5. ==============================

    5.OK, 약간 나 같은 사람들을위한 "쉽게"하지만 덜 괴짜 방법 :

    OK, 약간 나 같은 사람들을위한 "쉽게"하지만 덜 괴짜 방법 :

    당신의 모습을 하나 개의 테이블 'combined_city_state'을 갖고 있다고 :

    'Chicago, Illinois'
    

    2 개 다른 테이블에 그 복사 :

    CREATE TABLE city LIKE combined_city_state;
    INSERT city SELECT * FROM combined_city_state;
    
    CREATE TABLE state LIKE combined_city_state;
    INSERT state SELECT * FROM combined_city_state;
    

    이제 'combined_city_state'와 동일한 데이터 3 개 테이블이있다.

    이 기능을 설치합니다 :

    CREATE FUNCTION SPLIT_STR(
      x VARCHAR(255),
      delim VARCHAR(12),
      pos INT
    )
    RETURNS VARCHAR(255)
    RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
           LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
           delim, '');
    

    그런 다음 데이터의 추가 인덱스를 제거하기 위해 각 테이블에 이것을 적용

    UPDATE firms 
    SET city = (SELECT SPLIT_STR((city), ',', 1));
    
    
    UPDATE firms 
    SET state = (SELECT SPLIT_STR((state), ',', 2));
    

    단지 도시 중 하나 열, 단지 국가 중 하나가이 잎을. 당신이 더 이상 필요하지 않은 경우 이제 원래 'combined_city_state'열을 제거 할 수 있습니다.

  6. ==============================

    6.나는이 한 줄이 제대로 여기에 언급되지 않은 놀라게하고 있습니다 :

    나는이 한 줄이 제대로 여기에 언급되지 않은 놀라게하고 있습니다 :

    SELECT * FROM table
    WHERE id in (SELECT convert(int,Value) FROM dbo.Split(@list_string,',')
    

    당신이 필요로뿐만 아니라 다른 방법으로 유용하게되는 아래와 같은 분할 SQL 함수이다 :

    CREATE FUNCTION dbo.Split
    (
        @List nvarchar(2000),
        @SplitOn nvarchar(5)
    )  
    RETURNS @RtnValue table 
    (
    
        Id int identity(1,1),
        Value nvarchar(100)
    ) 
    AS  
    BEGIN
    While (Charindex(@SplitOn,@List)>0)
    Begin
        Insert Into @RtnValue (value)
        Select 
            Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))
            Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
    End
    
    Insert Into @RtnValue (Value)
    Select Value = ltrim(rtrim(@List))
    
    Return
    END
    
  7. ==============================

    7.나는 거기에 하이픈 구문 분석 된 데이터를 가지고있다. 아래의 예는 단지 테이블에 관련된 컬럼 이름에 대한 참조를 변경 보여주기 위해 고정 된 텍스트 문자열을 사용합니다. 나는 그것이 구성 요소의 수를 변화와 함께하고 결국 코드에 근무 보장하는 방법을 연령대에 연주 where 절을 추가하기로 결정했다. 당신이 구문 분석하려고하는 대부분의 데이터는 열 고정 된 수있을 것입니다.

    나는 거기에 하이픈 구문 분석 된 데이터를 가지고있다. 아래의 예는 단지 테이블에 관련된 컬럼 이름에 대한 참조를 변경 보여주기 위해 고정 된 텍스트 문자열을 사용합니다. 나는 그것이 구성 요소의 수를 변화와 함께하고 결국 코드에 근무 보장하는 방법을 연령대에 연주 where 절을 추가하기로 결정했다. 당신이 구문 분석하려고하는 대부분의 데이터는 열 고정 된 수있을 것입니다.

    select
    SUBSTRING_INDEX(TS,"-",1) as "1",
    reverse(left(reverse(SUBSTRING_INDEX(TS,"-",2)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",2)))-1)) as "2",
    reverse(left(reverse(SUBSTRING_INDEX(TS,"-",3)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",3)))-1)) as "3",
    reverse(left(reverse(SUBSTRING_INDEX(TS,"-",4)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",4)))-1)) as "4",
    reverse(left(reverse(SUBSTRING_INDEX(TS,"-",5)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",5)))-1)) as "5",
    reverse(left(reverse(SUBSTRING_INDEX(TS,"-",6)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",6)))-1)) as "6",reverse(left(reverse(SUBSTRING_INDEX(TS,"-",7)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",7)))-1)) as "7",
    reverse(left(reverse(SUBSTRING_INDEX(TS,"-",8)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",8)))-1)) as "8",
    reverse(left(reverse(SUBSTRING_INDEX(TS,"-",9)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",9)))-1)) as "9",
    reverse(left(reverse(SUBSTRING_INDEX(TS,"-",10)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",10)))-1)) as "10"
    from (select "aaa-bbb-ccc-ddd-eee-fff-ggg-hhh-iii-jjj" as TS) as S
    where (LENGTH(TS)-LENGTH(REPLACE(TS,'-',''))) =9
    
  8. ==============================

    8.A는 이상한 비트 만 :

    A는 이상한 비트 만 :

    SET @i = 1;
    set @str = 'a,b,c,d,e,f,g,h';
    
    select temp.length into @length from 
    (select
            ROUND(   
                (
                    LENGTH(dt.data)
                    - LENGTH( REPLACE (dt.data, ",", "") ) 
                ) / LENGTH(",")        
            )+1 AS length   
         from (select @str as data) dt
     ) temp;
    
    SET @query = CONCAT('select substring_index(
        substring_index(@str, '','', seq), 
        '','', 
        -1
      ) as letter from seq_', @i, '_to_',@length);
    
    PREPARE q FROM @query;
    EXECUTE q;
    
  9. ==============================

    9.당신은 수집 필터 FIND_IN_SET () 함수를 사용할 수 있습니다

    당신은 수집 필터 FIND_IN_SET () 함수를 사용할 수 있습니다

    방법을 분할 및 검색 기능-콤마 인스 MySQL을 값을 구분

    SELECT * FROM table WHERE find_in_set(table.id,commaSeparatedData) > 0;
    
  10. from https://stackoverflow.com/questions/2182668/how-to-split-comma-separated-text-in-mysql-stored-procedure by cc-by-sa and MIT license