Текст SQL полосы и преобразовать в целое число - PullRequest
2 голосов
/ 19 сентября 2008

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

activation successful of id 1010101

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

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

Ответы [ 7 ]

1 голос
/ 19 сентября 2008

Это должно сработать:

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

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

0 голосов
/ 19 сентября 2008
select cast(right(column_name,charindex(' ',reverse(column_name))) as int)
0 голосов
/ 19 сентября 2008
CAST(REVERSE(LEFT(REVERSE(@Test),CHARINDEX(' ',REVERSE(@Test))-1)) AS INTEGER)
0 голосов
/ 19 сентября 2008

Вы были бы готовы написать немного кода? Один из вариантов, создать пользовательскую функцию 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)
0 голосов
/ 19 сентября 2008

Если строка комментария ТОЧНО похожа на эту, вы можете использовать replace.

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 проблемы).

0 голосов
/ 19 сентября 2008

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

select convert(int, substring(fieldName, len('activation successful of id '), len(fieldName) - len('activation successful of id '))) from tableName
0 голосов
/ 19 сентября 2008
-- 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.

...