SQL条文本并转换为整数
时间:2020-03-06 14:26:23 来源:igfitidea点击:
在我的数据库(SQL 2005)中,我有一个包含注释的字段,但是在注释中我有一个ID,并且我想仅去除该ID,如果可能,请将其转换为int:
激活ID 1010101成功
上面的行是db字段中数据的确切结构。
而且不,我不想在应用程序的代码中执行此操作,实际上,我不想触摸它,以防万一我们想知道;-)
解决方案
-- Test table, you will probably use some query DECLARE @testTable TABLE(comment VARCHAR(255)) INSERT INTO @testTable(comment) VALUES ('activation successful of id 1010101') -- Use Charindex to find "id " then isolate the numeric part -- Finally check to make sure the number is numeric before converting SELECT CASE WHEN ISNUMERIC(JUSTNUMBER)=1 THEN CAST(JUSTNUMBER AS INTEGER) ELSE -1 END FROM ( select right(comment, len(comment) - charindex('id ', comment)-2) as justnumber from @testtable) TT
我还要补充一点,这种方法更多地基于集合,因此对于一堆数据值更有效。但是,仅将一个值作为变量来执行此操作非常容易。除了使用列注释,还可以使用类似@chvComment的变量。
我目前尚无测试方法,但:
select convert(int, substring(fieldName, len('activation successful of id '), len(fieldName) - len('activation successful of id '))) from tableName
这应该可以解决问题:
SELECT SUBSTRING(column, PATINDEX('%[0-9]%', column), 999) FROM table
根据样本数据,这表明字符串中仅出现一个整数且该整数在结尾。
如果注释字符串完全一样,则可以使用replace。
select replace(comment_col, 'activation successful of id ', '') as id from ....
几乎可以肯定的是,如果激活不成功怎么办?
我们可能最终会使用嵌套的replace语句
select replace(replace(comment_col, 'activation not successful of id ', ''), 'activation successful of id ', '') as id from ....
[抱歉无法从此编辑屏幕中得知那是完全有效的sql]
那开始变得凌乱;我们可以考虑创建一个函数并将替换语句放入其中。
如果这是一项一次性工作,那将不会有什么关系。我们也可以使用正则表达式,但这很慢(无论如何,这意味着我们现在有2个问题)。
我们愿意编写一些代码吗?一种选择是,创建CLR用户定义函数,然后使用Regex。我们可以在此处找到更多详细信息。这将处理复杂的字符串。
如果我们上面的行始终被格式化为"成功激活id #######",并且电话号码位于该字段的末尾,则:
declare @myColumn varchar(100) set @myColumn = 'activation successful of id 1010102' SELECT @myColumn as [OriginalColumn] , CONVERT(int, REVERSE(LEFT(REVERSE(@myColumn), CHARINDEX(' ', REVERSE(@myColumn))))) as [DesiredColumn]
会给你:
OriginalColumn DesiredColumn ---------------------------------------- ------------- activation successful of id 1010102 1010102 (1 row(s) affected)
CAST(REVERSE(LEFT(REVERSE(@Test),CHARINDEX(' ',REVERSE(@Test))-1)) AS INTEGER)
select cast(right(column_name,charindex(' ',reverse(column_name))) as int)