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

Может ли Mysql разделить столбец?

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

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 выполнял эту обработку. Спасибо!

4b9b3361

Ответ 1

Используйте

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

в предложении where.

SELECT * FROM `table`
WHERE 
substring_index(`column`,',',1)<0 
AND
substring_index(`column`,',',1)>5

Ответ 2

Кажется, это работает:

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-е и т.д.

Объяснение:

Внутренний 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", потому что он взял последние два значения.

Пример:

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

Здесь prices - это название столбца в MyTable.

Ответ 3

Обычно substring_index делает то, что вы хотите:

mysql> select substring_index("[email protected]","@",-1);
+-----------------------------------------+
| substring_index("[email protected]","@",-1) |
+-----------------------------------------+
| gmail.com                               |
+-----------------------------------------+
1 row in set (0.00 sec)

Ответ 5

В качестве дополнения к этому, у меня есть строки формы: Некоторые слова 303

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

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

Однако проблема заключается в том, что вы получаете ответ "да, он соответствует", а не индекс начала регулярного выражения.

Ответ 6

Вот еще один вариант, который я опубликовал по соответствующему вопросу. Проверка 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) возвращает первый n
  • SUBSTRING_INDEX(string, delim, -1) возвращает только последний
  • REGEXP '((delim).*){n}' проверяет, есть ли n разделителей (т.е. вы находитесь в границах)

Ответ 7

Он работает..

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;