[SQL] 어떻게 분할 쉼표는 MySQL을 저장 프로 시저의 텍스트를 분리
SQL어떻게 분할 쉼표는 MySQL을 저장 프로 시저의 텍스트를 분리
어떻게 분할 쉼표 문 "에서"SQL의 사용 결과에 MySQL을 저장 프로 시저의 텍스트 (ID의 목록을) 분리.
SELECT * FROM table WHERE table.id IN (splitStringFunction(commaSeparatedData, ','));
해결법
-
==============================
1.당신은 두 가지 방법으로 할 수 있습니다 :
당신은 두 가지 방법으로 할 수 있습니다 :
-
==============================
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.이 작업을 달성하기 위해 저장 프로 시저 내부에 준비된 문을 사용할 수 있습니다. 당신은 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.이 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.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.나는이 한 줄이 제대로 여기에 언급되지 않은 놀라게하고 있습니다 :
나는이 한 줄이 제대로 여기에 언급되지 않은 놀라게하고 있습니다 :
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.나는 거기에 하이픈 구문 분석 된 데이터를 가지고있다. 아래의 예는 단지 테이블에 관련된 컬럼 이름에 대한 참조를 변경 보여주기 위해 고정 된 텍스트 문자열을 사용합니다. 나는 그것이 구성 요소의 수를 변화와 함께하고 결국 코드에 근무 보장하는 방법을 연령대에 연주 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.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.당신은 수집 필터 FIND_IN_SET () 함수를 사용할 수 있습니다
당신은 수집 필터 FIND_IN_SET () 함수를 사용할 수 있습니다
방법을 분할 및 검색 기능-콤마 인스 MySQL을 값을 구분
SELECT * FROM table WHERE find_in_set(table.id,commaSeparatedData) > 0;
from https://stackoverflow.com/questions/2182668/how-to-split-comma-separated-text-in-mysql-stored-procedure by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버 DATETIME 포맷 (0) | 2020.07.02 |
---|---|
[SQL] 대 'PATINDEX' '와 같은'SQL 문자열 비교 속도 (0) | 2020.07.02 |
[SQL] 중복이 SQL과 테이블에 위에 각 그룹에서 3 값을 선택하는 방법 [중복] (0) | 2020.07.01 |
[SQL] SQL 쿼리에서 역 중복 제거 (0) | 2020.07.01 |
[SQL] SQL 서버 : 어떻게 저장 프로 시저의 매개 변수로 데이터베이스 이름을 얻을 수 있습니다 (0) | 2020.07.01 |