我在sql中有一个数据集,如下所示:
Col1 Col2
13_DND_ 5
_DND_ 6
123_ETL_ 10
ETL_ 12
DND_ 15
_ETL_ 17如果Col1包含_DND_或_ETL_,我想删除DND_和ETL_左边的所有内容。
最终预期输出如下:
Col1 Col2 Col3
13_DND_456 5 DND_456
_DND_de1f 6 DND_de1f
123_ETL_mene 10 ETL_mene
ETL_test 12 ETL_test
DND_se 15 DND_se
_ETL_def_ 17 ETL_def_我尝试了下面的1个条件,但结果为空:
SELECT *, CASE WHEN Col1 LIKE '%_DND_%'
THEN RIGHT(Col1, LENGTH(Col1) - CHARINDEX('DND_', Col1)) ELSE Col1 END Col3;发布于 2019-04-25 22:04:28
我倾向于使用STUFF()
select (case when col1 like '%[_]DND%'
then stuff(col1, 1, charindex('_DND', col1) - 1, '')
when col1 like '%[_]END%'
then stuff(col1, 1, charindex('_END', col1) - 1, '')
else col1
end) as col3您的代码无法工作,因为除非"DND“从第二个位置开始,否则LIKE将失败。所以,它返回的是NULL。
因为_是LIKE中的通配符,所以LIKE模式对其进行转义。
发布于 2019-04-25 22:06:36
你忘了在LIKE中使用通配符。
而不是这样:
SELECT *, CASE WHEN Col1 LIKE '_DND_' 你想要这个:
SELECT *, CASE WHEN Col1 LIKE '%_DND_%' 发布于 2019-04-25 23:08:47
这可以满足我的需求:
SELECT *, CASE WHEN Col1 LIKE '%_DND_%' OR Col1 LIKE '%_ETL_%'
THEN RIGHT(Col1, length(Col1) - charindex('-', Col1)) ELSE Col1 END Col3 FROM DF;https://stackoverflow.com/questions/55851013
复制相似问题