0

任务是从 STATION(tablename) 中列出不以元音开头或不以元音结尾的 CITY(column) 名称。我已经使用子字符串函数解决了它。下面的代码在 MySQL 服务器上完成了任务,但在 MS SQL SERVER 上给出了不同的输出。

我试图找出 MySQL 和 MS SQL Server 之间的区别。但无法弄清楚是什么问题。

SELECT DISTINCT CITY FROM STATION WHERE SUBSTRING(CITY,1,1) NOT IN ('A','E','I','O','U')OR 
SUBSTRING(LOWER(CITY),-1,1) NOT IN ('a','e','i','o','u')

我希望列不以元音开头或不以元音结尾。

4

2 回答 2

2

您可以将其重写为:

SELECT DISTINCT CITY 
FROM STATION 
WHERE LEFT(CITY,1) NOT IN ('A','E','I','O','U') 
  AND RIGHT(CITY,1) NOT IN ('a','e','i','o','u');
于 2019-09-08T10:39:38.243 回答
2

SUBSTRING()由于负起始位置在 SQL Server 中的行为不同:

SUBSTRING(LOWER(CITY),-1,1) NOT IN ('a','e','i','o','u')

来自https://docs.microsoft.com/en-us/sql/t-sql/functions/substring-transact-sql?view=sql-server-2017

如果 start 小于 1,则返回的表达式将从表达式中指定的第一个字符开始。在这种情况下,返回的字符数是 start + length-1 或 0 之和的最大值。

所以像 -1 这样的负起始位置并不意味着它将返回字符串的最后一个字符。
但是您可以使用以下功能获得它RIGHT()

...OR RIGHT(LOWER(CITY), 1) NOT IN ('a','e','i','o','u')
于 2019-09-08T10:56:48.130 回答