MySQL可以拆分列吗?

j2cgzkjk  于 2022-10-31  发布在  Mysql
关注(0)|答案(8)|浏览(210)

我有一个包含逗号分隔数据的列:

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来完成处理工作。
谢谢你!

fslejnso

fslejnso1#

用途

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
fsi0uk1n

fsi0uk1n2#

这似乎行得通:

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)

它表示第一个值、第二个值、第三个值等。

说明:

内部的substring_index返回用逗号分隔的前n个值。因此,如果原始字符串是“34,7,23,89”,则substring_index( context,',', 3)返回“34,7,23”。
外部的substring_index取内部的substring_index返回的值,-1允许你取最后一个值,所以你从“34,7,23”中得到“23”。
如果您指定-2,则会得到“7,23”,而不是-1,因为它取最后两个值。

示例:

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

这里,pricesMyTable中的列的名称。

w3nuxt5m

w3nuxt5m3#

通常,substring_index会执行您想要的操作:

mysql> select substring_index("foo@gmail.com","@",-1);
+-----------------------------------------+
| substring_index("foo@gmail.com","@",-1) |
+-----------------------------------------+
| gmail.com                               |
+-----------------------------------------+
1 row in set (0.00 sec)
kcugc4gi

kcugc4gi4#

您可以通过使用MySQL REGEXP或LIKE来获得所需的内容。
请参阅MySQL Docs on Pattern Matching

wmomyfyw

wmomyfyw5#

作为补充,我有如下形式的字符串:有些话303
我想把数字部分从字符串尾部分离出来。这似乎指向了一个可能的解决方案:
http://lists.mysql.com/mysql/222421
然而,问题是您只得到了答案“是的,它匹配”,而不是regexp匹配的开始索引。

nlejzf6q

nlejzf6q6#

这里是我在相关问题上发布的另一个变体。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个分隔符(即您在边界内)
63lcw9qa

63lcw9qa7#

在@Oleksiy的答案的基础上,这里有一个可以处理可变段长度(在合理的范围内)的字符串,例如逗号分隔的地址:

SELECT substring_index ( substring_index ( address,',',1 ), ',', -1) AS address_line_1,
   IF(address_parts > 1, substring_index ( substring_index ( address,',',2 ), ',', -1), '') AS address_line_2,
   IF(address_parts > 2, substring_index ( substring_index ( address,',',3 ), ',', -1), '') AS address_line_3,
   IF(address_parts > 3, substring_index ( substring_index ( address,',',4 ), ',', -1), '') AS address_line_4,
   IF(address_parts > 4, substring_index ( substring_index ( address,',',5 ), ',', -1), '') AS address_line_5
FROM (
    SELECT address, LENGTH(address) - LENGTH(REPLACE(address, ',', '')) AS address_parts
      FROM mytable
) AS addresses
6ljaweal

6ljaweal8#

它的工作..

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;

相关问题