복붙노트

[SQL] MySQL의 문자열과 함께 작업에) (폭발의 등가

SQL

MySQL의 문자열과 함께 작업에) (폭발의 등가

MySQL을, 나는 '31를 검색 할 수 있도록하려면 - 7 ', 때 다른 값 ='7-31 '을. 내가 MySQL의에서 문자열을 따로 휴식 할 때 사용하는 구문은 무엇입니까? (- $ 문자열 '')와 함께 넣어 PHP, 나는 아마 폭발 사용할 수 있습니다. MySQL의에서이 작업을 수행 할 수있는 방법이 있나요?

배경 : 나는 스포츠 점수와 협력 점수가 동일한 (와 같은 날짜에)있는 게임을 시도하려는거야 - 뒤로 그들의 상대의 데이터베이스 레코드에 비해 각 팀 나열된 점수를.

이상적인 MySQL의 호출은 다음과 같습니다

Where opponent1.date  = opponent2.date
  AND opponent1.score = opponent2.score

(상대 2.score는 상대 1.score의 뒤쪽으로 할 필요가있을 것이다).

해결법

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

    1.MYSQL에는 () 내장 함수처럼 폭발하지 않았다. 그러나 당신은 쉽게 DB에 유사한 기능을 추가 한 다음 PHP 쿼리에서 사용할 수 있습니다. 그 기능은 다음과 같이 표시됩니다

    MYSQL에는 () 내장 함수처럼 폭발하지 않았다. 그러나 당신은 쉽게 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),
           LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1),
           delim, '');
    

    용법:

    SELECT SPLIT_STRING('apple, pear, melon', ',', 1)
    

    위의 예는 사과를 반환합니다. 나는 당신이 POS에서 명시 적으로 반환 할 발생 지정해야하므로 MySQL의에서 배열을 반환하는 것은 불가능 될 것이라고 생각합니다. 당신이 그것을 사용하여 성공하면 알려주세요.

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

    2.내가 SUBSTRING_INDEX와 시도 (문자열, 구분자, 카운트)

    내가 SUBSTRING_INDEX와 시도 (문자열, 구분자, 카운트)

    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

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

    3.이 방법으로 저장 프로 시저를 사용할 수 있습니다 ..

    이 방법으로 저장 프로 시저를 사용할 수 있습니다 ..

    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 ;
    
  4. ==============================

    4.우선 당신은 데이터베이스 구조를 변경해야합니다 -이 경우 점수가 예를 들어, 복합 값의 일종이며, 두 개의 컬럼에 저장해야합니다. score_host, score_guest.

    우선 당신은 데이터베이스 구조를 변경해야합니다 -이 경우 점수가 예를 들어, 복합 값의 일종이며, 두 개의 컬럼에 저장해야합니다. score_host, score_guest.

    MySQL은 당신이 SUBSTRING ()를 사용하여 호스트와 게스트의 점수를 잘라 ()를 찾습니다 수 있습니다이 경우 그러나 해당) (폭발 제공하지 않습니다.

    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"를 캐스팅하는 데 사용됩니다.

  5. ==============================

    5.이 기능을 사용합니다. 그것은 마법처럼 작동합니다. 교체 "|" 등등 폭발 숯 / 분할 및 1,2,3- 값으로 데이터 세트의 엔트리 수에 기초 : Value_ONE | Value_TWO | Value_THREE.

    이 기능을 사용합니다. 그것은 마법처럼 작동합니다. 교체 "|" 등등 폭발 숯 / 분할 및 1,2,3- 값으로 데이터 세트의 엔트리 수에 기초 : Value_ONE | Value_TWO | Value_THREE.

    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
    

    이게 도움이 되길 바란다.

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

    6.@ 아르 멘-p는 지적 MYSQL이 더 폭발했다 (). 그러나, 나는 훨씬 더는 필요 이상 복잡에 제시된 해결책을 생각합니다. 당신이 (예를 들어, 테이블 키의 목록을 확인합니다) 당신이 쉼표로 구분 된 목록의 문자열을 제공하는 경우 빠른 검사를 수행합니다 :

    @ 아르 멘-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 확인할 필요가 있다고 가정합니다. 당신이 그것을 필요로하지 않는 경우, 그 조건을 추가하지 않습니다.

  7. ==============================

    7.그림과 같이 사용 SUBSTRING_INDEX 내가 열 score1 및 score2있는 테이블을 작성한 아래 예에서 score1 3-7, 7-3 score2 등이있다. "-"쿼리 아래 사용하여 분할 할 수 있고 score2의 순서를 반대로하고 score1 비교

    그림과 같이 사용 SUBSTRING_INDEX 내가 열 score1 및 score2있는 테이블을 작성한 아래 예에서 score1 3-7, 7-3 score2 등이있다. "-"쿼리 아래 사용하여 분할 할 수 있고 score2의 순서를 반대로하고 score1 비교

    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
    

  8. ==============================

    8.새로운 캐릭터를 구축하는 foreach는 함께 사용되어 폭발 할 경우는 사용하여 폭발 시뮬레이션 할 수 있습니다 동안이 같은 루프 :

    새로운 캐릭터를 구축하는 foreach는 함께 사용되어 폭발 할 경우는 사용하여 폭발 시뮬레이션 할 수 있습니다 동안이 같은 루프 :

    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 목록을 반환합니다. (필요한 변수 legths 첨가되어야 할)

  9. ==============================

    9.내 경우에, 제발 메모를 오늘 같은 문제에 직면하고 아래와 같이 해결, 나는 그러므로 내가 그들에게이 방법을 복구 할 수 있으며, 연결된 문자열의 항목 수를 알고 :

    내 경우에, 제발 메모를 오늘 같은 문제에 직면하고 아래와 같이 해결, 나는 그러므로 내가 그들에게이 방법을 복구 할 수 있으며, 연결된 문자열의 항목 수를 알고 :

    set @var1=0;
    set @var2=0;
    SELECT SUBSTRING_INDEX('value1,value2', ',', 1) into @var1;
    SELECT SUBSTRING_INDEX('value1,value2', ',', -1) into @var2;
    

    VAR1 @ 및 VAR2 @ 변수가 폭발 할 유사한 값을 가질 것이다 ().

  10. ==============================

    10.이것은 실제로 유니 코드 문자를 지원하기 위해 선택한 답변의 수정 된 버전입니다하지만 난이 의견을 충분히 평판이 없습니다.

    이것은 실제로 유니 코드 문자를 지원하기 위해 선택한 답변의 수정 된 버전입니다하지만 난이 의견을 충분히 평판이 없습니다.

    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, '')
    

    수정 사항은 다음과 같습니다 :

  11. ==============================

    11.나는 확실히이 완전히 질문을 (그렇지 않은) 응답되어 있지 않다 경우,하지만 내가 매우 비슷한 문제에 대한 해낸 솔루션입니다. 나는 다른 솔루션의 일부는 짧은 보면 알 수 있지만 필요 이상으로 SUBSTRING_INDEX () 방법을 사용하는 것 같다. 여기가 구분 당 한 번만) (LOCATE 단지 사용하려고합니다.

    나는 확실히이 완전히 질문을 (그렇지 않은) 응답되어 있지 않다 경우,하지만 내가 매우 비슷한 문제에 대한 해낸 솔루션입니다. 나는 다른 솔루션의 일부는 짧은 보면 알 수 있지만 필요 이상으로 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');
    
  12. from https://stackoverflow.com/questions/5928599/equivalent-of-explode-to-work-with-strings-in-mysql by cc-by-sa and MIT license