我有一个包含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
id
--
AN54055Z
EH86963D
CV08705Z
DW40205J
CT77535S
AV10045A
AH28395U
答案 0 :(得分:1)
您可以使用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
答案 1 :(得分:0)
您正在寻找的是regular expressions,也称为正则表达式,这是一种用于搜索文本模式的宏语言。
以下是一个正则表达式,它匹配2个字母大写,后跟5个数字,然后是一个字母字符。
[A-Z]{2}[0-9]{5}[A-Z]
您可以在LIKE
语句中使用WHERE
来匹配模式,例如
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
答案 2 :(得分:0)
值得注意的是,如果这是您需要经常检索的数据,您可以在表中创建计算列,甚至可以根据需要对其进行索引。请注意我的代码和评论。
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;