Extract data between characters SQL(在字符之间提取数据SQL)
本文介绍了在字符之间提取数据SQL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试检索字符之间的随机数据
数据示例:
ABC-33-Ha8o89-00
ABC-232-Ui7380-000
在上面的示例中,我正在尝试获取Ha8o89和Ui7380。基本上是从左起两个破折号和从右起一个破折号之后的所有数据。
推荐答案
给定此数据:
CREATE TABLE dbo.RandomData(StringValue varchar(128));
INSERT dbo.RandomData(StringValue) VALUES
('ABC-33-Ha8o89-00'),
('ABC-232-Ui7380-000');
假设您声明始终有三个破折号:
,这是一种快捷而肮脏的方法SELECT StringValue,
Parsed = PARSENAME(REPLACE(StringValue,'-','.'), 2)
-- parsename starts right
FROM dbo.RandomData;
2016+可以使用OPENJSON
:
SELECT r.StringValue, Parsed = j.value
FROM dbo.RandomData AS r
CROSS APPLY OPENJSON ('["'
+ REPLACE(r.StringValue, '-', '","') + '"]') AS j
WHERE [key] = 2; -- keys are 0-based
在任何版本上,您都可以使用有序拆分函数(有几十个示例),这里是我从this article和this earlier answer中抓取的一个:
CREATE FUNCTION dbo.SplitOrdered
(
@list nvarchar(max),
@delim nvarchar(10)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
WITH w(n) AS (SELECT 0 FROM (VALUES (0),(0),(0),(0)) w(n)),
k(n) AS (SELECT 0 FROM w a, w b),
r(n) AS (SELECT 0 FROM k a, k b, k c, k d, k e, k f, k g, k h),
p(n) AS (SELECT TOP (COALESCE(LEN(@list), 0))
ROW_NUMBER() OVER (ORDER BY @@SPID) -1 FROM r),
spots(p) AS
(
SELECT n FROM p
WHERE (SUBSTRING(@list, n, LEN(@delim + 'x') - 1) LIKE @delim OR n = 0)
),
parts(p,val) AS
(
SELECT p, SUBSTRING(@list, p + LEN(@delim + 'x') - 1,
LEAD(p, 1, 2147483647) OVER (ORDER BY p) - p - LEN(@delim))
FROM spots AS s
)
SELECT listpos = ROW_NUMBER() OVER (ORDER BY p),
Item = LTRIM(RTRIM(val))
FROM parts
);
则查询为:
SELECT r.StringValue, Parsed = s.Item
FROM dbo.RandomData AS r
CROSS APPLY dbo.SplitOrdered(r.StringValue, '-') AS s
WHERE s.listpos = 3; -- listpos is 1-based
此db<>fiddle中的所有三个示例。
这篇关于在字符之间提取数据SQL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:在字符之间提取数据SQL


基础教程推荐
猜你喜欢
- 带有WHERE子句的LAG()函数 2022-01-01
- 从字符串 TSQL 中获取数字 2021-01-01
- while 在触发器内循环以遍历 sql 中表的所有列 2022-01-01
- MySQL 5.7参照时间戳生成日期列 2022-01-01
- 带更新的 sqlite CTE 2022-01-01
- ORA-01830:日期格式图片在转换整个输入字符串之前结束/选择日期查询的总和 2021-01-01
- 使用 VBS 和注册表来确定安装了哪个版本和 32 位 2021-01-01
- MySQL根据从其他列分组的值,对两列之间的值进行求和 2022-01-01
- CHECKSUM 和 CHECKSUM_AGG:算法是什么? 2021-01-01
- 如何在 CakePHP 3 中实现 INSERT ON DUPLICATE KEY UPDATE aka upsert? 2021-01-01