我有小数点的列,我想让它成为实数,请看下面

时间:2016-11-29 16:07:22

标签: sql-server

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

3 个答案:

答案 0 :(得分:4)

我尝试在此使用SUBSTRINGNULL会导致问题,因此您需要添加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