You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL查询中获取字符串模板与提取特定编号?

你的两个SQL问题的解决方案

一、提取字符串中的特定编号

你给出的字符串里的编号是数字.数字.数字.数字这种格式,不同SQL数据库可以用正则匹配来提取,我给你分几种常用数据库的具体写法:

MySQL/MariaDB(8.0+)

MySQL 8.0及以上支持REGEXP_SUBSTR函数,能直接匹配提取。如果要抓所有符合的编号,得结合临时数字表来处理多个匹配结果:

-- 提取第一个匹配的编号
SELECT REGEXP_SUBSTR('Questions that may already have your answer 107.755.741332.1 Questions that may already have your answer 117.700.741372.1', '[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+') AS first_id;

-- 提取所有匹配的编号(这里用临时数字表生成1-3的数字,覆盖可能的匹配数)
WITH nums AS (SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3)
SELECT REGEXP_SUBSTR(your_column, '[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+', 1, n) AS id
FROM your_table, nums
WHERE REGEXP_SUBSTR(your_column, '[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+', 1, n) IS NOT NULL;

PostgreSQL

PostgreSQL的regexp_matches函数可以直接返回所有匹配的结果,配合unnest把数组转成行:

-- 从指定字符串提取所有编号
SELECT unnest(regexp_matches('Questions that may already have your answer 107.755.741332.1 Questions that may already have your answer 117.700.741372.1', '[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+', 'g')) AS id;

-- 从表的列中提取
SELECT unnest(regexp_matches(your_column, '[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+', 'g')) AS id
FROM your_table;

SQL Server(2016+)

SQL Server可以用循环提取或者OPENJSON配合正则,这里给两种方案:

-- 方案1:循环提取适合少量匹配的场景
DECLARE @str NVARCHAR(MAX) = 'Questions that may already have your answer 107.755.741332.1 Questions that may already have your answer 117.700.741372.1';
DECLARE @result TABLE (id NVARCHAR(50));

WHILE PATINDEX('%[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+%', @str) > 0
BEGIN
    INSERT INTO @result
    SELECT SUBSTRING(@str, PATINDEX('%[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+%', @str), CHARINDEX(' ', @str + ' ', PATINDEX('%[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+%', @str)) - PATINDEX('%[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+%', @str));
    SET @str = STUFF(@str, 1, CHARINDEX(' ', @str + ' ', PATINDEX('%[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+%', @str)), '');
END

SELECT * FROM @result;

-- 方案2:用OPENJSON更简洁
SELECT value AS id
FROM OPENJSON('["' + REPLACE(REGEXP_REPLACE(@str, '[^0-9.]', ' '), ' ', '","') + '"]')
WHERE value LIKE '[0-9]%.[0-9]%.[0-9]%.[0-9]%' AND value <> '';

二、获取两种字符串模板

如果你说的“获取两个字符串模板”是指从文本中提取符合两种特定格式的字符串,核心思路就是用正则表达式的逻辑或把两种模板的规则合并,然后用对应数据库的正则提取函数来抓结果。

举个实际例子:假设你要同时提取数字.数字.数字.数字和Q-[0-9]+(比如Q-123这种格式),以PostgreSQL为例可以这么写:

SELECT unnest(regexp_matches(your_column, '[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+|Q-[0-9]+', 'g')) AS matched_string
FROM your_table;

这里的|就是“或”的意思,把两个模板的正则规则放在两边,就能同时匹配两种格式的字符串了。不同数据库的正则语法略有差异,但核心逻辑都是一样的——先定义每种模板的匹配规则,再合并规则进行提取。


内容的提问来源于stack exchange,提问作者dasdsadasdsad asdasdas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:44:08