2009-07-08 4 views
47

У меня есть столбец, который разделенные запятой данные:Может 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

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

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

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

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

41

Использование

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 
+2

Мне пришлось использовать substring_index (substring_index ('column', ',', - 1), ',', 1), чтобы получить второе значение. Использование -2 последовательно дало мне первое значение. Тем не менее, он отлично работал. :) –

+0

Индексы в этом ответе немного запутываются, когда вы добавляете больше строк. – Tom

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

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

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

Действительно полезный ... –

12

Это похоже на работу:

SUBSTRING_INDEX (SUBSTRING_INDEX (контекст, '', 1), '' , -1))
SUBSTRING_INDEX (SUBSTRING_INDEX (контекст, '', 2), ' ' -1))
SUBSTRING_INDEX (SUBSTRING_INDEX (контекст,', ' 3),',', - 1))
SUBSTRING_INDEX (SUBSTRING_INDEX (контекст, '', 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.

+1

Это то, что сработало для меня. Спасибо, Алексей! – Nav

+0

Это более четкий ответ, поскольку его индексы более структурированы. – Tom

Смежные вопросы