Вопрос по split, mysql – Может ли MySQL разделить колонку?

50

У меня есть столбец, в котором есть данные, разделенные запятыми:

1,2,3
3,2,1
4,5,6
5,5,5

Я пытаюсь запустить поиск, который бы запрашивал каждое значение строки CSV в отдельности.

0<first<5   and  1<second<3  and  2<third<4 

Я понял, что могу вернуть все запросы, разбить его сам и сравнить. Мне любопытно, если есть способ сделать это, так что MySQL выполняет эту обработку. Спасибо!

Ваш Ответ

7   ответов
44

substring_index(`column`,',',1) ==> first value
substring_index(substring_index(`column`,',',-2),',',1)=> second value
substring_index(substring_index(`column`,',',-1),',',1)=> third value

в вашем пункте, где.

SELECT * FROM `table`
WHERE 
substring_index(`column`,',',1)<0 
AND
substring_index(`column`,',',1)>5
Я должен был использовать substring_index (substring_index (column, ',', - 1), ',', 1), чтобы получить второе значение. Использование -2 последовательно дало мне первое значение. Работал отлично, хотя. :)
Индексы в этом ответе становятся немного запутанными, когда вы добавляете больше строк.
0

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(
SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(col,'1', 1), '2', 1), '3', 1), '4', 1), '5', 1), '6', 1)
, '7', 1), '8', 1), '9', 1), '0', 1) as new_col  
FROM table_name group by new_col; 
7

SUBSTRING_INDEX делает то, что вы хотите:

mysql> select substring_index("[email protected]","@",-1);
+-----------------------------------------+
| substring_index("[email protected]","@",-1) |
+-----------------------------------------+
| gmail.com                               |
+-----------------------------------------+
1 row in set (0.00 sec)
Действительно полезно ...
1

REGEX полезно проверить, не выходят ли вы за пределы, поэтому для столбца таблицы вы должны поместить его в предложение where.

SET @Array = 'one,two,three,four';
SET @ArrayIndex = 2;
SELECT CASE 
    WHEN @Array REGEXP CONCAT('((,).*){',@ArrayIndex,'}') 
    THEN SUBSTRING_INDEX(SUBSTRING_INDEX(@Array,',',@ArrayIndex+1),',',-1) 
    ELSE NULL
END AS Result;
SUBSTRING_INDEX(string, delim, n) returns the first n SUBSTRING_INDEX(string, delim, -1) returns the last only REGEXP '((delim).*){n}' checks if there are n delimiters (i.e. you are in bounds)
1

Некоторые слова 303

где я хотел бы отделить числовую часть от хвоста строки. Это, кажется, указывает на возможное решение:

http://lists.mysql.com/mysql/222421

Проблема, однако, заключается в том, что вы получаете только ответ «да, он соответствует», а не начальный индекс соответствия регулярному выражению.

4
17

substring_index ( substring_index ( context,',',1 ), ',', -1) ) 
substring_index ( substring_index ( context,',',2 ), ',', -1) ) 
substring_index ( substring_index ( context,',',3 ), ',', -1) ) 
substring_index ( substring_index ( context,',',4 ), ',', -1) )

это означает 1-е значение, 2-е, 3-е и т. д.

Explanation:

Внутреннийsubstring_index возвращает первые n значений, разделенных запятыми. Таким образом, если ваша исходная строка - "34,7,23,89",substring_index( context,',', 3) возвращает "34,7,23".
Внешнийsubstring_index принимает значение, возвращаемое внутреннимsubstring_index и-1 позволяет принять последнее значение. Таким образом, вы получите «23» из "34,7,23".
Вместо-1 если вы укажете-2, вы получите 7,23, поскольку оно приняло последние два значения.

Example:
select * from MyTable where substring_index(substring_index(prices,',',1),',',-1)=3382;

Вот,prices это имя столбца вMyTable.

Это то, что сработало для меня. Спасибо Алексей!
Это более четкий ответ, учитывая, что его индексы более структурированы.

Похожие вопросы