من یک رشته دارم که طولش مشخص نیست . مثلا 6 کاراکتر ، شاید 10 شاید 12 شاید 20
به کمک یک قطعه کد ، به صورت 3 رقم ، 3 رقم از سمت راست جدا بشه .بجز استفاده از دستور format
من یک رشته دارم که طولش مشخص نیست . مثلا 6 کاراکتر ، شاید 10 شاید 12 شاید 20
به کمک یک قطعه کد ، به صورت 3 رقم ، 3 رقم از سمت راست جدا بشه .بجز استفاده از دستور format
می خواهیدبا دستورات sql جدا بشه؟ format دستور sql نیست!
تابع format در نسخه 2012 در T-SQL اجرا می شود.
به هر حال راه حلی که من مدنظر دارم بر پایه این هست که شما یه حداکثر طول برای رشته خود در نظر بگیرید.
از دو طرف می توانید اقدام به تجزیه رشته کنید راست و چپ. اگر از راست اقدام می کنید کار کمی دشوار میشود باید توسط تابع reverse رشته را برعکس کنید و زیر رشته مورد نظر را بدست آورده و مجدد آن را reverse کنید.
از چپ مستلزم این هست که شما طول رشته را ضریبی از 3 درآورده باشید در این حالت به سادگی می توانید از چپ شروع به تجزیه رشته کنید.
اگر نیاز به کد دقیق دارید بایستی یک Sample در اینجا ارائه دهید.
وبلاگ من (Advanced SQL Querying)
این طور هم میشه نوشت:
DECLARE @SepratedString nvarchar(max)
WHILE LEN(@String) >= 3
BEGIN
SET @SepratedString = SUBSTRING(@String, LEN(@String)-2,3)
SET @String = SUBSTRING(@String, 0,LEN(@String)-2)
print @SepratedString
CONTINUE
END
IF LEN(@String)<3
SET @SepratedString = @String
print @SepratedString
اگر بخواهیم ارقام با کاما از هم جدا شود چطور؟
--پشتیبانی تا 12 رقم
--داده ها فرض می شود از جدول قرار هست خوانده شوند
select replace(ltrim(replace(replace(
reverse(stuff(stuff(stuff(t.s,4,0,','),8,0,','),12 ,0,','))
, '~',''), ',', ' ')),' ',',') as result
from (--مقادیر مورد نظر در زیر لیست شده اند
values ('1'),
('1234567890'),
('1234')
)as d(s)
cross apply (select reverse(replicate('~',11)+d.s)) as t(s);
/*خروجی کوئری فوق
result
--------------
1
1,234,567,890
1,234
*/
آخرین ویرایش به وسیله محمد سلیم آبادی : شنبه 02 آذر 1392 در 20:08 عصر
وبلاگ من (Advanced SQL Querying)
سلام و تشکر از دوستمان
من کدش یکمی تغییر دادم و خوب جواب داد
--پشتیبانی تا 12 رقم
--داده ها فرض می شود از جدول قرار هست خوانده شوند
select replace(ltrim(replace(replace(
reverse(stuff(stuff(stuff(t.s,4,0,','),8,0,','),12 ,0,','))
, '~',''), ',', ' ')),' ',',') as result
from ( select national_code from CardTable
)as d(s)
cross apply (select reverse(replicate('~',11)+d.s)) as t(s);