سؤال

في قاعدة البيانات الخاصة بي (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 ....

[عذرًا، لا يمكنني معرفة ما إذا كان هذا صحيحًا تمامًا من شاشة التعديل هذه]

يبدأ الأمر بالفوضى.قد تفكر في إنشاء وظيفة ووضع عبارات الاستبدال فيها.

إذا كانت هذه وظيفة لمرة واحدة، فلن يكون الأمر مهمًا حقًا.يمكنك أيضًا استخدام التعبير العادي، لكن هذا بطيء جدًا (ويعني على أي حال أن لديك الآن مشكلتين).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top