가능하지만 실제 환경에서 사용하는 것보다 데이터베이스를 재 설계하도록하는 것이 좋습니다.
상수를 함께 사용하여 숫자 범위를 생성 할 수 있습니다. 그것은 당신이 0에서 9까지의 숫자를 조합하고 십자가에 합류하면 0에서 99까지의 숫자를 생성 할 수 있습니다 (또 다른 교차 결합은 0에서 999까지를 제공합니다). 이것을 SUBSTRING_INDEX와 함께 사용하여 쉼표를 기준으로 문자열을 분할 할 수 있습니다.
이렇게하면 substring_index를 사용하여 마지막에 반환 된 숫자를 최대 회수로 늘리는 것과 같이 substring_index를 사용하면 DISTINCT를 사용할 수 있습니다. 당신이 원하는 경우
SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ',', 1 + units.i + tens.i * 10), ',', -1), ':', 1) AS id
FROM some_table
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ',', 1 + units.i + tens.i * 10), ',', -1), ':', -1) = 6
는 중복 배의 오른쪽 숫자는 쉼표로 구분 된 값의 수 (수 아무것도로 대체 모든 쉼표로 필드의 길이 필드의 길이를 비교를 확인해야 반환 쉼표 수) : -
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ',', 1 + units.i + tens.i * 10), ',', -1), ':', 1) AS id
FROM some_table
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ',', 1 + units.i + tens.i * 10), ',', -1), ':', -1) = 6
AND (units.i + tens.i * 10) <= (LENGTH(some_field) - LENGTH(REPLACE(some_field, ',','')))
두 가지 모두 최대 100 개의 쉼표로 구분 된 값만 처리합니다. 더 쉽게 대처할 수 있도록 확장하기는 쉽지만 쿼리가 느려지 게됩니다.
편집 - 당신은 지금 위에 게시 한 데모 날짜 상태의 대상 코스 이름을 얻을 : - 이것에 대한
SELECT education_details.id, education.target_course_name
FROM education_details
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
INNER JOIN education ON SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(status, ',', 1 + units.i + tens.i * 10), ',', -1), ':', 1) = education.id
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(status, ',', 1 + units.i + tens.i * 10), ',', -1), ':', -1) = 6
AND (units.i + tens.i * 10) <= (LENGTH(status) - LENGTH(REPLACE(status, ',','')));
SQL 바이올린 : -
http://www.sqlfiddle.com/#!2/a2917/5
는 가정 위 예제에서 주어진 결과로'172'와'173'을 원합니다. 문자열을 파싱하고 ID와 STATUS 열이있는 임시 테이블에 모든 문자열을 집어 넣은 다음 쿼리를 실행합니다. –
데이터베이스를 정상화 할 기회가 있으면 그렇게해야합니다. 문자열 비교 및 자리 표시자를 사용하여 선택하는 것은 DBMS에서 데이터를 검색하는 최악의 경우입니다. 관계에 대해 별도의 테이블을 만들고 그 테이블을 쿼리하십시오. – feeela
나는 많은 테이블을 조인했다. 그리고 나는 나의 ID의 상태를 6이어야한다. 내 테이블을 임시 테이블로 정규화하고 사용하는 것은 약간 복잡한 프로세스이다. – nitin