>我有一列,其值将是
1_987123
12_987654
在这里,我只需要分隔列值中'1'
和'12'
的第一个字母。我已经尝试substring
和charindex
来找到价值。我使用的语法是: substring(Columnname,1,charindex('_',Columnname,1)-1)
.
这可以查找具有值的列。但就我而言,我们在列中有空白值。在这种情况下,上述语法会给出错误。尝试了coalesce
等场景,并且不接受列数据类型varchar
。
你能建议我一些其他选择吗?
您需要使用 CASE
表达式来处理不'_'
的值:
WITH Tbl(col) AS(
SELECT '1_987123' UNION ALL
SELECT '12_987654' UNION ALL
SELECT '12'
)
SELECT
CASE
WHEN CHARINDEX('_', col) > 0 THEN LEFT(col, CHARINDEX('_', col)-1)
ELSE col
END
FROM Tbl
你可以通过在后面的下划线上作弊
SELECT LEFT (col, CHARINDEX('_', col + '_') - 1)
你可以这样尝试,它支持空值、不带下划线的值和列中的空字符串值。
SELECT CASE
WHEN charindex('_', COL) > 0
THEN substring(col, 1, charindex('_', COL) - 1)
ELSE col
END
FROM (
VALUES ('1_987123')
,('12_987654')
,('12')
,(NULL)
,('')
) T(COL)
像这样使用过滤器,
SELECT CASE
WHEN charindex('_', COL) > 0
THEN substring(col, 1, charindex('_', COL) - 1)
ELSE col
END
FROM (
VALUES ('1_987123')
,('12_987654')
,('12')
,(NULL)
,('')
,('3_545')
,('3')
) T(COL)
where col like '3%'
您可以使用一个技巧,从位置 0 而不是位置 1 开始,不要减去 1。当没有下划线时,这将返回空字符串。
SELECT
SUBSTRING(Columnname,0,charindex('_',Columnname,1))
FROM (values('1_987123'),('7123'),('12_987654')) x(columnname)
结果:
1
12