Подтвердить что ты не робот

Эквивалент explode() для работы со строками в MySQL

В MySQL я хочу иметь возможность искать '31 - 7', когда другое value = '7 - 31'. Каков синтаксис, который я бы использовал, чтобы разбить строки в MySQL? В PHP я бы, вероятно, использовал explode(' - ',$string) и объединил их. Есть ли способ сделать это в MySQL?

Справочная информация. Я работаю со спортивными оценками и хочу попробовать игры, в которых оценки одинаковы (а также в ту же дату). Указанная оценка для каждой команды обратно сравнивается с записью базы данных противника.

Идеальный вызов MySQL:

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

(opponent2.score должен быть opponent1.score назад).

4b9b3361

Ответ 1

MYSQL не имеет встроенной функции explode(). Но вы можете легко добавить аналогичную функцию в свою БД, а затем использовать ее из 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)

В приведенном выше примере вернется apple. Я думаю, что вернуть массив в MySQL будет невозможно, поэтому вы должны указать, какое из ячеек должно явным образом возвращаться в pos. Дайте мне знать, если вам удастся его использовать.

Ответ 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 ;
  • Пример вызова:

     SET @str  = "The quick brown fox jumped over the lazy dog"; 
     SET @delim = " "; 
    
    CALL explode(@delim,@str);
    SELECT id,word FROM temp_explode;
    

Ответ 4

Прежде всего, вы должны изменить структуру базы данных - оценка в этом случае является некотором составным значением и должна храниться в двух столбцах, например. score_host, score_guest.


MySQL не обеспечивает эквивалент explode(), но в этом случае вы можете использовать SUBSTRING() и LOCATE(), чтобы отрезать счет хоста и гостя.

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

Используйте эту функцию. Отлично работает. замените "|" с char для взрыва/расщепления, а значения 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

Как указано в @arman-p, у MYSQL нет explode(). Однако я считаю, что решение представлено гораздо сложнее, чем нужно. Чтобы выполнить быструю проверку, когда вам задана строка списка с разделителями-запятыми (например, список ключей таблицы для поиска), выполните следующие действия:

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

Это предполагает, что вам также нужно также проверить поле_3 на таблице. Если вам это не нужно, не добавляйте это условие.

Ответ 7

используйте substring_index, в приведенном ниже примере я создал таблицу с столбцами Score1 и Score2, Score1 имеет 3-7, Score2 7-3 и т.д., как показано на рисунке. Приведенный ниже запрос может быть разделен с помощью "-" и обратный порядок 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

scores table

query results

Ответ 8

если explode используется вместе с foreach для создания новой строки, которую вы можете смоделировать в результате взрыва, используя цикл while следующим образом:

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-список частей. (необходимо добавить обязательные переменные слова)

Ответ 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 будут иметь значения, похожие на explode().

Ответ 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, '')

Модификации следующие:

  • Первый параметр установлен как utf8
  • Функция настроена на возврат utf8
  • Код использует CHAR_LENGTH() вместо LENGTH() для вычисления длины символа, а не длины байта.