我正在创建patindex:
字符1必须为Alpha而不是空格,其余字符应包含任意A-Z,a-z,空格或'-
patindex('^ [A-Z]%[A-Za-z '-]','Worktester')
但这似乎不起作用
似乎PATINDEX()不允许这种模式匹配。
请问这是正确的还是任何对表达有帮助的链接?
谢谢
答案 0 :(得分:1)
有时,使用模式匹配的技巧是找到不良而不是好的样式。要验证长度未知的字符串(而不是提取子字符串),可以搜索不可接受的字符的模式:
declare @Samples as Table ( Sample VarChar(16) );
insert into @Samples ( Sample ) values
( 'Worktester' ), ( 'Foo Bar' ), ( 'Voot-Plex' ),
( 'BR549' ), ( ' Spaced Out' ), ( 'low down' ), ( 'Oops!' );
select Sample,
-- Check the first character for uppercase alpha only.
PatIndex( '[^A-Z]%', Sample collate Latin1_General_BIN ) as Part1,
-- Check the remaining characters for any mix of alpha, space and hyphen.
PatIndex( '_%[^-A-Za-z ]%', Sample collate Latin1_General_BIN ) as Part2,
-- Put it together into a single status.
case
when PatIndex( '[^A-Z]%', Sample collate Latin1_General_BIN ) = 0 and
PatIndex( '_%[^-A-Za-z ]%', Sample collate Latin1_General_BIN ) = 0 then 'Good'
else 'Bad' end as Status
from @Samples;
请注意,默认排序规则通常不区分大小写。尝试通过删除显式排序规则来更改Part1
行。
答案 1 :(得分:0)
你能试试这个吗
patindex('[A-Z]%[A-Za-z ''-]%','Worktester')
答案 2 :(得分:0)
使用PATINDEX进行模式匹配可能会很麻烦。
由于LIKE或PATINDEX的模式语法比Regexp的模式语法受到更多限制。
如果只是要过滤掉其他字符,则可以使用LIKE代替PATINDEX。
由于它们使用相同的语法,因此您无需知道其位置。
似乎您只需要检查第一个字符是否为字母,并且是否不包含字母,空格,引号或破折号即可。
declare @Table table (
ID int identity(1,1) primary key,
Col varchar(30) not null,
IsValid bit
);
insert into @Table (col, isValid) values
('Foobar',1), ('Foo-''Bar''',1), ('foo bar',1),
(' Foo',0), ('F0ob4r',0), ('Foo?',0);
SELECT *
FROM @Table
WHERE Col LIKE '[a-z]%'
AND Col NOT LIKE '%[^a-z ''-]%';
结果:isValid = 1的那些
或在情况下使用
SELECT *,
(CASE
WHEN Col LIKE '[a-z]%' AND Col NOT LIKE '%[^a-z ''-]%'
THEN 1
ELSE 0
END) AS isOk
FROM @Table;