【问题标题】:MySQL Select only part of columnMySQL仅选择列的一部分
【发布时间】:2023-03-19 11:52:01
【问题描述】:

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

DIRL100

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

可以像这样使用这个特定的列:

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

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

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

【问题讨论】:

  • 完全不明白你的问题,你能举一些例子和预期的输出吗?
  • (但我不能确定它在获得数字之前总是 4 个字符(DIRL))那么你的拆分条件是什么?
  • 拆分条件是前缀以字母结尾。将更新问题
  • 你需要 MariaDB 的regexp_replace()

标签: mysql regex substring


【解决方案1】:

试试这个请求:

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

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 2019-02-18
    • 2015-01-14
    • 2016-09-01
    • 1970-01-01
    • 2012-12-06
    • 2021-07-01
    • 1970-01-01
    • 2015-02-03
    相关资源
    最近更新 更多