2016-10-04 152 views
1

如何只选择列的一部分?我知道我可以使用子字符串,但我需要选择列的字符串部分。作为一个例子:列可包含以下内容:MySQL只选择列的一部分

DIRL100

我需要仅选择在一列中DIRL部分,并且100部分作为另一个。

这个特定列可以做到这一点,像这样:

SELECT SUBSTRING(column, 5) AS part1, SUBSTRING(column, 1, 4) AS part2 ....

但我不能肯定它总是4个字母(二RL)它得到的数字前。可我以某种方式使用REGEXP或者只提取每列中的数字部分和字母部分?

换句话说..我可以拆分字母结束的列。它可以作为示例包含DIRL100AB100200,它应该分成两列,每列包含列(DIRL或AB)中的字母以及列中的数字(100或100200)?

+0

完全不了解您的问题,请您举一些例子和预期的输出? –

+0

(但我不能确定它总是4个字符(DIRL)在它变成数字之前)那么你的分割条件是什么? – Karthi

+0

分割条件是前缀结束时是字母。将更新问题 –

回答

1

试试这个请求:

SELECT LEFT(column, patindex('%[0-9]%', column)-1) AS Part1 
    , RIGHT(column, LEN(column) - patindex('%[0-9]%', column)+1) AS Part2 
+0

它适用于你的2个例子... – Francois

+0

这是sql服务器,问题是关于mysql。 patindex可以为mysql创建,请参阅http://stackoverflow.com/questions/38315658/patindex-replacement-in-mysql – Kris

+0

Ooops ... MySQL错过了! :) – Francois

0

不幸的是,在MySQL中的正则表达式的功能是有限的。你必须编写一个自定义函数来帮助你。

DROP FUNCTION IF EXISTS get_index; 

DELIMITER $$ 
CREATE FUNCTION get_index(targetString VARCHAR(255)) RETURNS INTEGER 
BEGIN 

    DECLARE i INTEGER; 
    DECLARE min_index INTEGER; 
    DECLARE current_index INTEGER; 
    SET i = 0; 
    SET min_index = NULL; 

    loopNumbers: WHILE (i <= 9) DO 
     SET current_index = LOCATE(i, targetString); 
     IF current_index > 0 THEN 
      IF min_index IS NULL OR current_index < min_index THEN 
       SET min_index = current_index; 
      END IF; 
     END IF; 

     SET i = i + 1; 

    END WHILE; 

    RETURN(min_index); 

END 
$$ 
DELIMITER ; 

这个函数做的是获得数字的第一个位置。然后,使用此功能,您可以修改您的查询:

SELECT SUBSTRING(column_name FROM 1 FOR get_index(column_name)-1) AS first, SUBSTRING(column_name FROM get_index(column_name)) AS second 
FROM table_name 
WHERE column_name REGEXP '^[a-Z]+[0-9]+$' 

附加WHERE条件是可选的,以保证只有正确的格式数据被选择。