Эквивалент 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
назад).
Ответы
Ответ 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
. Дайте мне знать, если вам удастся его использовать.
Ответ 2
Я пытаюсь использовать 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
Ответ 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
Прежде всего, вы должны изменить структуру базы данных - оценка в этом случае является некотором составным значением и должна храниться в двух столбцах, например. 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()
для вычисления длины символа, а не длины байта.