i有一个表,其中包含1000秒的行,带有α数字数据,例如:
select id from status_table
id
--
N #AN54055Z / MATTHEW
345 IN EH86963D JP Verified o
C N # CV08705Z PP CONF / A
UI 45 Ty
1548 47 CN #DW40205J VERIFIED AF
N #-CT77535S
78 78Thi OK
584 C yu N #AV10045A/DONNA MO
AH28395U VERIF BK MAH
yu YUyu789 56
我想在结果中返回的alpha数字字符的独特组合:
例如:alpha alpha数字数字数字alpha
id
--
AN54055Z
EH86963D
CV08705Z
DW40205J
CT77535S
AV10045A
AH28395U
您可以使用PATINDEX
检查模式,然后使用此返回值(模式开始的位置)作为SUBSTRING
中的开始位置。由于模式是静态的,因此SUBSTRING
declare @t table (x varchar(256))
insert into @t values
('N #AN54055Z / MATTHEW'),
('345 IN EH86963D JP Verified o'),
('C N # CV08705Z PP CONF / A'),
('UI 45 Ty'),
('1548 47 CN #DW40205J VERIFIED AF'),
('N #-CT77535S'),
('78 78Thi OK'),
('584 C yu N #AV10045A/DONNA MO'),
('AH28395U VERIF BK MAH'),
('yu YUyu789 56')
select d.* from(
select
case
when PATINDEX('%[a-zA-Z][a-zA-Z][0-9][0-9][0-9][0-9][0-9][a-zA-Z]%',x) > 0
then substring(x,PATINDEX('%[a-zA-Z][a-zA-Z][0-9][0-9][0-9][0-9][0-9][a-zA-Z]%',x),8)
else null
end as id
from @t) d
where d.id is not null
您要寻找的称为正则表达式,也称为Regex,这是一种宏观语言,用于搜索文本中的模式。
以下是与2个alpha字符大写的正则表达式,然后是5个数字,然后是一个alpha字符。
[A-Z]{2}[0-9]{5}[A-Z]
您可以在WHERE
语句中使用LIKE
匹配模式,例如
WHERE MyField LIKE '%[A-Z]{2}%'
。在SQL Server 2008上,您可以使用Patindex查找正则表达式的第一匹匹配的索引。
我现在无法运行测试SQL,但是我认为类似的事情可能有效:
SELECT
PATINDEX ( '%([A-Z]{2}[0-9]{5}[A-Z])%', Id ) as TestPatIdx,
CASE
WHEN PATINDEX ( '%([A-Z]{2}[0-9]{5}[A-Z])%', Id ) > 0 THEN
SUBSTRING( MyField, PATINDEX ( '%([A-Z]{2}[0-9]{5}[A-Z])%' , Id ), 8 )
END as TestResult,
Id
FROM
status_table
值得注意的是,如果这是您需要经常检索的数据,则可以创建一个计算的列第一列表,甚至可以在需要的情况下进行索引。注意我的代码和评论。
IF OBJECT_ID('tempdb..#t') is not null drop table #t;
CREATE TABLE #t
(
-- the original column
x varchar(256),
-- A computed column to extract that data ahead of time
xx as
case
when PATINDEX('%[a-zA-Z][a-zA-Z][0-9][0-9][0-9][0-9][0-9][a-zA-Z]%',x) > 0
then substring(x,PATINDEX('%[a-zA-Z][a-zA-Z][0-9][0-9][0-9][0-9][0-9][a-zA-Z]%',x),8)
end persisted
);
-- optional index if you search on that column frequently
-- NOTE That you indexes can speed up SELECT statements but will impact inserts/updates/deletes
CREATE NONCLUSTERED INDEX nc_t_xx ON #t(xx);
--declare @t table (x varchar(256))
insert into #t (x) values
('N #AN54055Z / MATTHEW'),
('345 IN EH86963D JP Verified o'),
('C N # CV08705Z PP CONF / A'),
('UI 45 Ty'),
('1548 47 CN #DW40205J VERIFIED AF'),
('N #-CT77535S'),
('78 78Thi OK'),
('584 C yu N #AV10045A/DONNA MO'),
('AH28395U VERIF BK MAH'),
('yu YUyu789 56')
SELECT x, xx
FROM #t;