SQL实现:通过处理两个字符串列生成新字符串列的需求及问题求助
解决从NameVer字段中移除末尾"-Ver"部分的问题
我来帮你搞定这个需求!你的目标是从NameVer字段里精准移除末尾的-<对应Ver值>部分(包括那个横杠),同时保留字段中间的横杠,还要处理可能存在的不可见空白字符对吧?先看看你之前代码出错的原因,再给你正确的解决方案。
为什么你的原代码得不到预期结果?
你之前写的SELECT SUBSTRING(NameVer, 1, LEN(Ver)+1) from myTable逻辑完全不对:LEN(Ver)是版本号的字符长度,加1后是固定截取前N个字符,比如第一行的Ver是10021(长度5),加1就是6,所以只截取了前6个字符Dr. Cr,这显然不是你要的结果。我们需要的是定位到末尾的-<Ver>位置,再截取前面的内容,而不是固定长度。
正确的SQL解决方案
下面的语句可以精准实现你的需求,同时处理空白字符:
SELECT NameVer, Ver, TRIM(SUBSTRING(NameVer, 1, CHARINDEX('-' + Ver, NameVer) - 1)) AS Name FROM myTable
代码解释:
'-' + Ver:构造我们要精准匹配的后缀(横杠+版本号),这样就能定位到NameVer末尾的目标部分,不会误匹配中间的横杠。CHARINDEX('-' + Ver, NameVer):找到这个后缀在NameVer中的起始位置。SUBSTRING(NameVer, 1, 位置-1):从NameVer开头截取到后缀起始位置的前一个字符,这样就去掉了-<Ver>部分。TRIM():自动去除结果前后的不可见空白字符(比如空格、制表符),确保输出干净。
测试你的示例数据
用你提供的测试数据运行上面的语句,会得到完全符合预期的结果:
| NameVer | Ver | Name |
|---|---|---|
| Dr. Cristine Pharrel HF-10021 | 10021 | Dr. Cristine Pharrel HF |
| Mary-2Jane Jean-CF2331 | CF2331 | Mary-2Jane Jean |
| Michael 1772 d'Oro-1027763 | 1027763 | Michael 1772 d'Oro |
额外的边界处理(可选)
如果担心某些行的NameVer里没有匹配的-<Ver>后缀,可以加个CASE语句做兼容,避免报错:
SELECT NameVer, Ver, CASE WHEN CHARINDEX('-' + Ver, NameVer) > 0 THEN TRIM(SUBSTRING(NameVer, 1, CHARINDEX('-' + Ver, NameVer) - 1)) ELSE TRIM(NameVer) -- 没有匹配到的话,返回trim后的原字段 END AS Name FROM myTable
内容的提问来源于stack exchange,提问作者pacpac1
相关产品推荐
相关产品推荐

