SQL 剥离文本并转换为整数

Posted

技术标签:

【中文标题】SQL 剥离文本并转换为整数【英文标题】:SQL strip text and convert to integer 【发布时间】:2008-09-19 15:04:51 【问题描述】:

在我的数据库 (SQL 2005) 中,我有一个包含评论的字段,但在评论中我有一个 id,我想只删除 id,如果可能的话,将其转换为 int:

activation successful of id 1010101

上面一行是db字段中数据的确切结构。

不,我不想在应用程序的代码中这样做,实际上我不想碰它,以防万一你想知道;-)

【问题讨论】:

您想将 db 中的字段更改为只有 id 号并将字段设置为 int?有点不清楚你在做什么。 在选择时我只想拥有数字(从字段中的数据中删除),我不想更改数据库字段。 【参考方案1】:

这应该可以解决问题:

SELECT SUBSTRING(column, PATINDEX('%[0-9]%', column), 999)
FROM table

根据您的示例数据,字符串中仅出现一次整数并且位于末尾。

【讨论】:

【参考方案2】:

我目前没有办法测试它,但是:

select convert(int, substring(fieldName, len('activation successful of id '), len(fieldName) - len('activation successful of id '))) from tableName

【讨论】:

【参考方案3】:

您愿意编写一些代码吗?一种选择是创建 CLR 用户定义函数,然后使用正则表达式。您可以找到更多详细信息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)

【讨论】:

【参考方案4】:
select cast(right(column_name,charindex(' ',reverse(column_name))) as int)

【讨论】:

【参考方案5】:
CAST(REVERSE(LEFT(REVERSE(@Test),CHARINDEX(' ',REVERSE(@Test))-1)) AS INTEGER)

【讨论】:

【参考方案6】:
-- 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 之类的变量,而不是使用列注释。

【讨论】:

【参考方案7】:

如果评论字符串完全一样,您可以使用替换。

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 个问题)。

【讨论】:

以上是关于SQL 剥离文本并转换为整数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中将 HTML 转换为文本?

舍入双精度值并转换为整数

如何将 ResultSet 转换为有用的整数?

在正则表达式中匹配字符串中的数字并转换为整数[重复]

如何将文本列转换为 MS SQL Express 中的整数列?

将 ActionScript 2 SWF 转换为 ActionScript 3 SWF 文件(可以剥离代码)