web-dev-qa-db-ja.com

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がその処理作業を行うようにこれを行う方法があるかどうか興味があります。ありがとう!

56
ZA.

つかいます

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
49
raj karthy

うまくいくようです:

_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_は最後の値を取ることができます。したがって、「34,7,23」から「23」を取得します。
_-1_の代わりに_-2_を指定すると、最後の2つの値を取得したため、「7,23」が表示されます。

例:

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

ここで、pricesMyTableの列の名前です。

21

通常 substring_index はあなたが望むことをします:

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

MySQL REGEXPまたはLIKEを使用して、必要なものを取得できます。

パターンマッチングに関するMySQLドキュメント を参照してください。

4
Damo

関連する質問に私が投稿した別のバリエーションがあります。 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個あるかどうかを確認します(つまり、境界内にいます)
1
KCD

これの補遺として、次の形式の文字列があります。

ここで、文字列の末尾から数値部分を分割します。これは可能な解決策を指しているようです:

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

ただし、問題は、「はい、一致します」という答えしか得られず、正規表現の一致の開始インデックスが得られないことです。

1
Merijn Vogel

それは働いています。

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; 
0
user2257559