Sql server 如何将Oracle中的此正则表达式查询转换为SQL Server?

Sql server 如何将Oracle中的此正则表达式查询转换为SQL Server?,sql-server,regex,Sql Server,Regex,我是正则表达式查询的初学者,因此我想问您如何将Oracle中的正则表达式查询转换为SQL Server select * from Sales where regexp_like(productname,'^[A-Z]{3}[0-9]+$') 我将其转换为以下查询: select * from Sales where substr(productname, 1, 3) in ([A-Z]) 对吗 谢谢。您可以使用以下查询: SELECT * FROM Sales WHERE LEF

我是正则表达式查询的初学者,因此我想问您如何将Oracle中的正则表达式查询转换为SQL Server

select * 
from Sales 
where regexp_like(productname,'^[A-Z]{3}[0-9]+$')
我将其转换为以下查询:

select * 
from Sales 
where substr(productname, 1, 3) in ([A-Z]) 
对吗


谢谢。

您可以使用以下查询:

SELECT *
FROM Sales
WHERE LEFT(productname, 3) LIKE '[A-Z][A-Z][A-Z]' -- three chars ([A-Z]{3})
  AND NOT RIGHT(productname, LEN(productname) - 3) LIKE '%[^0-9]%' -- only numbers after the first three chars
  AND NOT LEN(RIGHT(productname, LEN(productname) - 3)) = 0 -- at least one number
基于regexp'^[A-Z]{3}[0-9]+$':

您可以使用TRIM:


我认为最简单的方法是使用

WHERE 
   SUBSTRING(<column>, 1, 1) IN('A', 'B', 'C')
 AND
   SUBSTRING(<column>, 2, 1) IN('A', 'B', 'C')
 AND
   SUBSTRING(<column>, 2, 1) IN('A', 'B', 'C') 
 AND
   TRY_CONVERT(
        INT
        , SUBSTRING(<column>, 4, LEN(<column>))
   ) <> 0
因为你真的不需要正则表达式来做这件事


请参见

之前的内容,它也适用于WHERE LEFTproductname,3类似于“[A-Z][A-Z][A-Z]”而不是RIGHTproductname,LENproductname-3类似于“[^0-9]%”@BarbarosÖzhan-不,因为ABC将匹配没有LENRIGHTproductname而不是LENproductname,LENproductname-3=0。但是原始正则表达式是^[A-Z]{3}[0-9]+。所以值必须是ABC,第四个字符应该是数字。非常感谢Brosch,您能解释一下“[^0-9]%”是什么意思吗?。我在某个地方读到“^”表示对比度[^0-9]%的意思应该是:不是数字??此表达式%[^0-9]%匹配所有字符,但不匹配数字0到9或空字符串。那么,您为什么这样写:“[^0-9]%”-仅匹配前三个字符后的数字?”?。我很困惑。
SELECT *
FROM Sales
WHERE productname LIKE '[A-Z][A-Z][A-Z][0-9]%'
  AND TRIM( '0123456789' FROM  productname) LIKE '[A-Z][A-Z][A-Z]';
      -- warning! expression is not SARGable
WHERE 
   SUBSTRING(<column>, 1, 1) IN('A', 'B', 'C')
 AND
   SUBSTRING(<column>, 2, 1) IN('A', 'B', 'C')
 AND
   SUBSTRING(<column>, 2, 1) IN('A', 'B', 'C') 
 AND
   TRY_CONVERT(
        INT
        , SUBSTRING(<column>, 4, LEN(<column>))
   ) <> 0