PATINDEX表达

时间:2018-11-19 16:19:37

标签: sql sql-server tsql

我正在创建patindex:

字符1必须为Alpha而不是空格,其余字符应包含任意A-Z,a-z,空格或'-

 patindex('^ [A-Z]%[A-Za-z '-]','Worktester')

但这似乎不起作用

似乎PATINDEX()不允许这种模式匹配。

请问这是正确的还是任何对表达有帮助的链接?

谢谢

3 个答案:

答案 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;