programing

MySQL에서 문자열로 동작하기 위한 breakdrop()에 상당합니다.

sourcejob 2022. 9. 27. 23:50
반응형

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

반응형