T-SQL到Postgres通配符逻辑



我正在将一些t-sql查询转换为postgres的过程中,我在postgres通配符逻辑上遇到了麻烦。

,

下面的查询在tsql中会产生'A',但是在postgres中它会返回'B'

Select 
case when 'abcd 1234' like '%[a-z]%[0-9]%' then 'A' else 'B' end as Q1

与上面的when语句等价的postgres是什么?此外,有没有人有将tsql字符串逻辑转换为postgres的一般经验法则?

提前感谢!

你在这里遇到的区别是,SQL Server的TSQL通过方括号[]语法接受字符范围通配符,但PostgreSQL不接受。

相反,PostgreSQL在使用RegEx匹配运算符(~的变体)代替LIKE的查询中集成了对POSIX正则表达式的支持,并且在区分大小写和字符串匹配方面提供了相当大的灵活性。

用POSIX RegEx语法重述原始查询以获得' a '的输出将类似于:

Select 
case when 'abcd 1234' ~ '(.*)[a-z](.*)[0-9](.*)' then 'A' 
else 'B' end as Q1

至于处理这些类型转换的一般启发式概念,我建议T-SQL字符集通配符应该使用RegEx匹配操作符实现为POSIX正则表达式,而不是LIKE。否则,T-SQL的%_通配符的行为等同于相同的PostgreSQL通配符。

引用:

  • https://learn.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql?view=sql-server-ver15
  • https://www.postgresql.org/docs/current/functions-matching.html像
  • https://www.postgresql.org/docs/current/functions-matching.html POSIX-BRACKET-EXPRESSIONS