在我的数据库(SQL 2005)中,我有一个字段,其中包含注释,但在注释中我有一个id,我想删除id,如果可能将其转换为int:
activation successful of id 1010101
上面的行是db字段中数据的确切结构。
不,我不想在应用程序的代码中执行此操作,我实际上不想触摸它,以防万一你想知道; - )
答案 0 :(得分:1)
这应该可以解决问题:
SELECT SUBSTRING(column, PATINDEX('%[0-9]%', column), 999)
FROM table
根据您的示例数据,字符串中只有一个整数出现,并且它在最后。
答案 1 :(得分:0)
-- 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
等变量来代替使用列注释。
答案 2 :(得分:0)
我目前没有办法测试它,但是:
select convert(int, substring(fieldName, len('activation successful of id '), len(fieldName) - len('activation successful of id '))) from tableName
答案 3 :(得分:0)
如果评论字符串完全相同,则可以使用替换。
select replace(comment_col, 'activation successful of id ', '') as id from ....
几乎肯定不会 - 不成功的激活怎么办? 您最终可能会使用嵌套的替换语句
select replace(replace(comment_col, 'activation not successful of id ', ''), 'activation successful of id ', '') as id from ....
[抱歉无法从此编辑屏幕判断,如果这是完全有效的sql]
开始变得混乱;您可以考虑创建一个函数并将替换语句放在其中。
如果这是一次性工作,那真的不重要。你也可以使用正则表达式,但这很慢(而且无论如何意味着你现在有2个问题)。
答案 4 :(得分:0)
您是否愿意编写一些代码?一个选项是创建CLR用户定义函数,然后使用Regex。您可以找到更多详细信息here。这将处理复杂的字符串。
如果您的上一行始终格式化为'激活成功的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)
答案 5 :(得分:0)
CAST(REVERSE(LEFT(REVERSE(@Test),CHARINDEX(' ',REVERSE(@Test))-1)) AS INTEGER)
答案 6 :(得分:0)
select cast(right(column_name,charindex(' ',reverse(column_name))) as int)