NULL
106/1
106/1
87/1
101/1
103/1
104/1
108/1
109/1
105/1
111/1
110/1
100/1
112/1
113/1
114/2
115/2
116/2
117/2
118/1
119/1
120/1
121/1
122/1
124/3
125/3
125/3
126/3
127/3
128/3
我想要
NULL
106
106
87
101
103
104
108
109
105
111
110
100
112
113
114
115
116
117
118
119
120
121
122
124
125
125
126
127
128
答案 0 :(得分:4)
我尝试在此使用SUBSTRING
。 NULL
会导致问题,因此您需要添加CASE
表达式
测试数据
CREATE TABLE #TestData (FieldName nvarchar(5))
INSERT INTO #TestData (FieldName)
VALUES
('NULL')
,('106/1')
,('106/1')
,('87/1')
,('101/1')
,('103/1')
,('104/1')
,('108/1')
,('109/1')
,('105/1')
,('111/1')
,('110/1')
,('100/1')
,('112/1')
查询
SELECT
FieldName
,CASE
WHEN CHARINDEX('/',FieldName) > 0
THEN SUBSTRING(FieldName,1,CHARINDEX('/',FieldName)-1)
ELSE FieldName
END NewField
FROM #TestData
结果
FieldName NewField
NULL NULL
106/1 106
106/1 106
87/1 87
101/1 101
103/1 103
104/1 104
108/1 108
109/1 109
105/1 105
111/1 111
110/1 110
100/1 100
112/1 112
答案 1 :(得分:0)
根据您发布的模式,您可以使用以下查询以您希望的格式获取数据:
(根据@ RichardBenner的回答,有一个CASE
语句来处理你的记录与这种模式不匹配的场景非常重要:
SELECT
CASE
WHEN CHARINDEX('/', column, 0) = 0
THEN column
ELSE LEFT(column, CHARINDEX('/', column, 0)-1)
END
FROM TABLE
WHERE column IS NOT NULL
但是,如果您想修改列中的数据,可以将其更改为UPDATE
:
UPDATE Table
SET Column = CASE
WHEN CHARINDEX('/', column, 0) = 0
THEN column
ELSE LEFT(column, CHARINDEX('/', column, 0)-1)
END
WHERE column IS NOT NULL
这将删除/
之后的所有内容,包括/
本身,不需要复杂的PATINDEX()
。
只是为了测试:
DECLARE @var varchar(10) = '123/4'
SELECT
CASE
WHEN charindex('/', @var, 0) = 0
THEN @var
ELSE LEFT(@var, charindex('/', @var, 0)-1)
END
答案 2 :(得分:0)
使用/
查找CHARINDEX
的内容,并使用/
函数<{1}}在LEFT
位置之前提取数据
Select LEFT(yourcolumn,charindex('/',yourcolumn)-1)
From yourtable
考虑到除了/
条记录
NULL