MySQL只选择列的一部分

时间:2016-10-04 12:15:04

标签: mysql regex substring

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

DIRL100

我只需要在一列中选择DIRL部分,而在另一列中选择100部分。

可以使用此特定列执行此操作:

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

但我不能确定它在获得数字之前总是有4个字母(DIRL)。我可以以某种方式使用REGEXP或其他东西来提取每列中的数字部分和字母部分吗?

换句话说..我可以按字母结束的位置拆分列。例如,它可以包含DIRL100AB100200,它应分成两列,每列包含列中的字母(DIRL或AB)和列中的数字(100或100200)?

2 个答案:

答案 0 :(得分:1)

尝试此请求:

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

答案 1 :(得分:0)

不幸的是,MySQL中的regexp功能是有限的。你必须编写一个自定义函数来帮助你。

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条件是可选的,以确保只选择正确格式的数据。