Вопрос

В моей базе данных (SQL 2005) у меня есть поле, содержащее комментарий, но в комментарии у меня есть идентификатор, и я хотел бы удалить только идентификатор и, ЕСЛИ возможно, преобразовать его в int:

activation successful of id 1010101

Строка выше представляет собой точную структуру данных в поле БД.

И нет, я не хочу делать это в коде приложения, я вообще-то не хочу этого трогать, на случай, если вам интересно ;-)

Это было полезно?

Решение

Это должно помочь:

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

Судя по вашему образцу данных, в строке имеется только одно целое число, и оно находится в конце.

Другие советы

На данный момент у меня нет возможности проверить это, но:

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

Не могли бы вы написать немного кода?Один из вариантов: создать пользовательскую функцию CLR, а затем использовать Regex.Вы можете найти более подробную информацию здесь.Это будет обрабатывать сложные строки.

Если ваша строка выше всегда отформатирована как «активация прошла успешно с идентификатором #######» с вашим номером в конце поля, то:

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)
select cast(right(column_name,charindex(' ',reverse(column_name))) as int)
CAST(REVERSE(LEFT(REVERSE(@Test),CHARINDEX(' ',REVERSE(@Test))-1)) AS INTEGER)
-- 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   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 проблемы).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top