我正在尝试提取两个下划线字符之间的数据。在某些情况下,第二个下划线可能不存在。
**MyFld**
P_36840
U_216137
C_203134_H
C_203134_W
我试过这个:
substring(i.[MyFld],
CHARINDEX ('_',i.[MyFld])+1,len(i.[MyFld])
-CHARINDEX ('_',i.[MyFld])
) [DerivedPrimaryKey]
我得到了这个:
**DerivedPrimaryKey**
36840
216137
203134_H
203134_W
https://dbfiddle.uk/uPKC6oX4
我想删除第二个下划线和它后面的数据。我试图将它与右修剪结合起来,但我不确定从哪里开始。
我该怎么做呢?
5条答案
按热度按时间kiz8lqtg1#
我们可以从简化到目前为止所拥有的内容开始,我还将添加足够的内容以使其成为一个完整的查询,这样我们就可以在后面的步骤中看到它:
完成这些工作后,我们现在可以使用它作为删除字段尾部的源代码:
注意嵌套层,当然,你可以删除嵌套,但这意味着每次看到
step1
时都要复制整个内部表达式(幸好我花了时间简化它):现在回到刚才的表达式:
在这里看到它的工作原理:
https://dbfiddle.uk/nFO4Vwhm
还有一个替代表达式可以节省一次函数调用:
0kjbasz62#
还有两个选项,一个是使用parsename(),前提是数据段不超过4个,另一个是使用JSON数组
示例
结果
6yjfywim3#
我们可以这样做:
如果第一个元素中的字符数是固定的,则可以简化为:
soat7uwm4#
如果期望的字符不总是存在,并且我不需要结果值,我通常会尝试伪造SQL:
我认为这很清楚,但我真的很喜欢@JohnCappalletti建议的ParseName解决方案。
如果只有一个数值,可以使用string_split:
无论哪种方式,在决定最佳方法之前,您都必须仔细查看数据。
1wnzp6jl5#
您的数据
使用
SubString
、Left
和PatIndex