نص شريط SQL وتحويله إلى عدد صحيح
سؤال
في قاعدة البيانات الخاصة بي (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 ....
[عذرًا، لا يمكنني معرفة ما إذا كان هذا صحيحًا تمامًا من شاشة التعديل هذه]
يبدأ الأمر بالفوضى.قد تفكر في إنشاء وظيفة ووضع عبارات الاستبدال فيها.
إذا كانت هذه وظيفة لمرة واحدة، فلن يكون الأمر مهمًا حقًا.يمكنك أيضًا استخدام التعبير العادي، لكن هذا بطيء جدًا (ويعني على أي حال أن لديك الآن مشكلتين).