Может ли 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 выполнял эту обработку.
Спасибо!
Ответы
Ответ 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)
Ответ 4
Вы можете получить то, что хотите, используя MySQL REGEXP или LIKE.
См. Документы MySQL по сопоставлению с образцом
Ответ 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;