MySQL에서 문자열로 동작하기 위한 breakdrop()에 상당합니다.
MySQL을 할 수 .'31 - 7'
값 = 른른 = 인 , = 우 , another another another , '7 - 31'
MySQL에서 문자열을 분할할 때 사용하는 구문은 무엇입니까?PHP를 사용할 입니다.explode(' - ',$string)
조립할 수 있을 거예요.MySQL 서 my my my my my my my my my?
배경:스포츠 스코어로 작업하고 있는데, 스코어가 같은 경기(및 같은 날짜)에 도전해 보고 싶습니다.각 팀의 스코어는 상대 팀의 데이터베이스 레코드에 비해 역방향입니다.
이상적인 MySQL 호출은 다음과 같습니다.
Where opponent1.date = opponent2.date
AND opponent1.score = opponent2.score
)opponent2.score
할 필요가 있다opponent1.score
★★★★★★★★★★★★★★★★★★」
에는 MYSQL이 .explode()
내장된 기능과 유사합니다.그러나 당신은 당신의 DB에 유사한 기능을 쉽게 추가하고 php 쿼리에서 그것을 사용할 수 있습니다.같이 됩니다.
CREATE FUNCTION SPLIT_STRING(str VARCHAR(255), delim VARCHAR(12), pos INT)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),
CHAR_LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1),
delim, '');
사용방법:
SELECT SPLIT_STRING('apple, pear, melon', ',', 1)
에서는 의 the 、 가 、 예 、 the the 。apple
를 반환할 수 에 MySQL에서 pos
사용 성공 시 알려주시기 바랍니다.
는 ㅇㅇㅇㅇㅇㅇㅇㅇ로 해봅니다.SUBSTRING_INDEX(string,delimiter,count)
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
-> 'mysql.com'
자세한 것은, mysql.com 를 참조해 주세요.http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_substring-index
저장 프로시저를 다음과 같이 사용할 수 있습니다.
DELIMITER |
CREATE PROCEDURE explode( pDelim VARCHAR(32), pStr TEXT)
BEGIN
DROP TABLE IF EXISTS temp_explode;
CREATE TEMPORARY TABLE temp_explode (id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, word VARCHAR(40));
SET @sql := CONCAT('INSERT INTO temp_explode (word) VALUES (', REPLACE(QUOTE(pStr), pDelim, '\'), (\''), ')');
PREPARE myStmt FROM @sql;
EXECUTE myStmt;
END |
DELIMITER ;
콜의 예:
SET @str = "The quick brown fox jumped over the lazy dog"; SET @delim = " "; CALL explode(@delim,@str); SELECT id,word FROM temp_explode;
먼저 데이터베이스 구조를 변경해야 합니다.이 경우 점수는 일종의 복합값으로, 예를 들어 다음과 같이 2개의 열에 저장됩니다. score_host
,score_guest
.
MySQL을 하지 않습니다.explode()
이 경우 및 를 사용하여 호스트와 게스트의 점수를 자를 수 있습니다.
SELECT
CONVERT(SUBSTRING(score, 1, LOCATE('-',score) - 2) USING INTEGER) as score_host,
CONVERT(SUBSTRING(score, LOCATE('-',score)+2) USING INTEGER) as score_guest
FROM ...;
CONVERT()
스트링 캐스팅에 사용됩니다."23"
23
.
이 기능을 사용합니다.그것은 마법처럼 작용한다."|"를 분해/분할 문자로 대체하고 값 1,2,3 등은 데이터 세트 내의 엔트리 수를 기반으로 합니다.Value_ONE|Value_TWO | Value_THREW.
SUBSTRING_INDEX(SUBSTRING_INDEX(`tblNAME`.`tblFIELD`, '|', 1), '|', -1) AS PSI,
SUBSTRING_INDEX(SUBSTRING_INDEX(`tblNAME`.`tblFIELD`, '|', 2), '|', -1) AS GPM,
SUBSTRING_INDEX(SUBSTRING_INDEX(`tblNAME`.`tblFIELD`, '|', 3), '|', -1) AS LIQUID
이게 도움이 됐으면 좋겠어요.
substring_index를 사용합니다.아래 예에서는 그림과 같이 score1과 score2의 컬럼을 가진 테이블을 만들었습니다.score1은 3-7, score2는 7-3 등입니다.아래 쿼리는 "-"를 사용하여 분할하고 점수 2의 순서를 반대로 하여 점수 1과 비교할 수 있습니다.
SELECT CONCAT(
SUBSTRING_INDEX(score1, '-', 1),
SUBSTRING_INDEX(score1,'-',-1)
) AS my_score1,
CONCAT(
SUBSTRING_INDEX(score2, '-', -1),
SUBSTRING_INDEX(score2, '-', 1)
) AS my_score2
FROM test HAVING my_score1=my_score2
@arman-p가 지적했듯이 MYSQL에는 폭발이 없습니다.하지만, 저는 제시된 해결책이 필요 이상으로 복잡하다고 생각합니다.쉼표로 구분된 목록 문자열(예: 검색할 테이블 키 목록)이 주어졌을 때 빠른 확인을 수행하려면 다음을 수행합니다.
SELECT
table_key, field_1, field_2, field_3
FROM
my_table
WHERE
field_3 = 'my_field_3_value'
AND (comma_list = table_key
OR comma_list LIKE CONCAT(table_key, ',%')
OR comma_list LIKE CONCAT('%,', table_key, ',%')
OR comma_list LIKE CONCAT('%,', table_key))
이것은 테이블 상의 field_3도 체크해야 한다는 것을 전제로 하고 있습니다.필요 없는 경우는, 그 조건을 추가하지 말아 주세요.
이것은 유니코드 문자를 지원하기 위해 선택한 답변의 수정 버전입니다만, 거기에 코멘트를 달 만한 평판이 없습니다.
CREATE FUNCTION SPLIT_STRING(str VARCHAR(255) CHARSET utf8, delim VARCHAR(12), pos INT) RETURNS varchar(255) CHARSET utf8
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),
CHAR_LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1),
delim, '')
변경된 내용은 다음과 같습니다.
- 첫 번째 파라미터는 다음과 같이 설정됩니다.
utf8
- 함수가 반환되도록 설정되었습니다.
utf8
- 코드는 다음과 같습니다.
CHAR_LENGTH()
대신LENGTH()
바이트 길이가 아닌 문자 길이를 계산합니다.
폭발을 포어치와 함께 사용하여 새 스트링을 작성하는 경우 다음과 같이 while loop을 사용하여 폭발을 시뮬레이션할 수 있습니다.
CREATE FUNCTION explode_and_loop(sep VARCHAR(),inputstring VARCHAR()) RETURNS VARCHAR()
BEGIN
DECLARE part,returnstring VARCHAR();
DECLARE cnt,partsCnt INT();
SET returnstring = '';
SET partsCnt = ((LENGTH(inputstring ) - LENGTH(REPLACE(inputstring,sep,''))) DIV LENGTH(sep);
SET cnt = 0;
WHILE cnt <= partsCnt DO
SET cnt = cnt + 1;
SET part = SUBSTRING_INDEX(SUBSTRING_INDEX(inputstring ,sep,cnt),sep,-1);
-- DO SOMETHING with the part eg make html:
SET returnstring = CONCAT(returnstring,'<li>',part,'</li>')
END WHILE;
RETURN returnstring;
END
이 예에서는 부품의 HTML 목록을 반환합니다.(필요한 가변 레그를 추가해야 함)
오늘 같은 문제에 직면하여 다음과 같이 해결했습니다.저 같은 경우에는 연결된 문자열의 항목 수를 알고 있기 때문에 이 방법으로 복구할 수 있습니다.
set @var1=0;
set @var2=0;
SELECT SUBSTRING_INDEX('value1,value2', ',', 1) into @var1;
SELECT SUBSTRING_INDEX('value1,value2', ',', -1) into @var2;
변수 @var1 및 @var2의 값은 폭발과 비슷합니다.
이것이 질문에 완전히 답할 수 있을지는 모르겠지만(그렇지 않습니다) 매우 유사한 문제에 대해 제가 생각해 낸 해결책입니다.다른 솔루션 중 일부는 짧아 보이지만 SUBSTRING_INDEX()를 필요 이상으로 사용하고 있는 것 같습니다.여기서는 LOCATE()를 딜리미터별로 한 번만 사용합니다.
-- *****************************************************************************
-- test_PVreplace
DROP FUNCTION IF EXISTS test_PVreplace;
delimiter //
CREATE FUNCTION test_PVreplace (
str TEXT, -- String to do search'n'replace on
pv TEXT -- Parameter/value pairs 'p1=v1|p2=v2|p3=v3'
)
RETURNS TEXT
-- Replace specific tags with specific values.
sproc:BEGIN
DECLARE idx INT;
DECLARE idx0 INT DEFAULT 1; -- 1-origined, not 0-origined
DECLARE len INT;
DECLARE sPV TEXT;
DECLARE iPV INT;
DECLARE sP TEXT;
DECLARE sV TEXT;
-- P/V string *must* end with a delimiter.
IF (RIGHT (pv, 1) <> '|') THEN
SET pv = CONCAT (pv, '|');
END IF;
-- Find all the P/V pairs.
SELECT LOCATE ('|', pv, idx0) INTO idx;
WHILE (idx > 0) DO
SET len = idx - idx0;
SELECT SUBSTRING(pv, idx0, len) INTO sPV;
-- Found a P/V pair. Break it up.
SELECT LOCATE ('=', sPV) INTO iPV;
IF (iPV = 0) THEN
SET sP = sPV;
SET sV = '';
ELSE
SELECT SUBSTRING(sPV, 1, iPV-1) INTO sP;
SELECT SUBSTRING(sPV, iPV+1) INTO sV;
END IF;
-- Do the substitution(s).
SELECT REPLACE (str, sP, sV) INTO str;
-- Do next P/V pair.
SET idx0 = idx + 1;
SELECT LOCATE ('|', pv, idx0) INTO idx;
END WHILE;
RETURN (str);
END//
delimiter ;
SELECT test_PVreplace ('%one% %two% %three%', '%one%=1|%two%=2|%three%=3');
SELECT test_PVreplace ('%one% %two% %three%', '%one%=I|%two%=II|%three%=III');
SELECT test_PVreplace ('%one% %two% %three% - %one% %two% %three%', '%one%=I|%two%=II|%three%=III');
SELECT test_PVreplace ('%one% %two% %three% - %one% %two% %three%', '');
SELECT test_PVreplace ('%one% %two% %three% - %one% %two% %three%', NULL);
SELECT test_PVreplace ('%one% %two% %three%', '%one%=%two%|%two%=%three%|%three%=III');
언급URL : https://stackoverflow.com/questions/5928599/equivalent-of-explode-to-work-with-strings-in-mysql
'programing' 카테고리의 다른 글
각진 상태단일 페이지 애플리케이션(SPA) 전용 JS? (0) | 2022.09.27 |
---|---|
열의 모든 값을 소문자로 업데이트 (0) | 2022.09.27 |
JavaScript에서 문자열에서 파일 확장자를 자르는 방법 (0) | 2022.09.27 |
개체 배열을 속성별로 정렬합니다. (0) | 2022.09.27 |
PDF 문서를 PHP의 미리보기 이미지로 변환하려면 어떻게 해야 합니까? (0) | 2022.09.27 |