1

这个声明有什么问题,它仍然在字段之后给我空间。这让我认为组合 WHEN 语句的语法是关闭的。我的老板希望他们在一份声明中合并。我究竟做错了什么?

Case WHEN LTRIM(RTRIM(cSHortName))= '' Then NULL 
     WHEN cShortname is NOT NULL THEN 
       REPLACE (cShortName,SUBSTRING,(cShortName,PATINDEX('%A-Za-z0-9""},1,) ''_ 
end AS SHORT_NAME
4

4 回答 4

1

从代码来看,您似乎试图从字符串的开头和结尾去除空格和非字母数字字符。

如果是这样,这对你有用吗?我认为它提供了从第一个字母数字出现到最后一个的子字符串。

SELECT
SUBSTRING(
 cShortName,
 PATINDEX('%A-Za-z0-9',cShortName),
  ( LEN(cShortName)
   -PATINDEX('%A-Za-z0-9',REVERSE(cShortName))
   -PATINDEX('%A-Za-z0-9',cShortName)
  )
) AS SHORTNAME
于 2010-08-05T23:59:19.157 回答
0

为什么你认为它不应该在场后给你空间?

编辑:

据我了解,您正在尝试从字符串中删除与此正则表达式范围 [a-zA-Z0-9] 不匹配的任何字符(添加您要保留的任何其他字符)。

我看不到使用内置函数在 Microsoft SQL Server(您似乎正在使用 Microsoft SQL Server)中做到这一点的干净方法。网上有一些使用临时表和 while 循环的示例,但这很难看。我要么按原样返回字符串并在调用方处理它们,要么编写一个使用CLR执行此操作的函数并从 select 语句中调用它。

我希望这有帮助。

于 2010-08-05T22:15:33.357 回答
0

替换TRIMLTRIM

你也可以测试LEN(cShortName) = 0

于 2010-08-05T22:16:12.963 回答
0

嗯,这个脚本似乎有一些问题,但试试这个。

Case 
     WHEN LTRIM(RTRIM(cSHortName))= '' Then NULL
     WHEN cShortname is NOT NULL THEN REPLACE(cShortName, SUBSTRING(cShortName, PATINDEX('%A-Za-z0-9', 1) , ''), '') 
end AS SHORT_NAME
于 2010-08-05T22:20:36.730 回答