ورود

View Full Version : تواید حالات ممکنه یکی رشته با ی و ي



Developer Programmer
یک شنبه 22 خرداد 1390, 11:32 صبح
عده ای از کاربرا موقع ثبت، برخی حروف رو به صورت زیر وارد کردن:

ي ك ة

برخی دیگه به این صورت وارد کردن:

ی ک ه

از اونجا که امکان دستکاری داده ها در دیتابیس نیست، وقتی میخوام یه رشته رو در SQL بگردم، باید تمام حالات ممکنه رو تولید کنم. مثلا اگه دنبال رشته "بابک اصغری" می گردم. باید تمام ترکیبات ک، ی رو هم تولید کنم.

برای اینکار یه آرایه تعریف کردم که شامل حروف مشکل ساز هست
token(0) = "ی"
token(1) = "ي"
token(2) = "ک"
token(3) = "ك"
token(4) = "ه"
token(5) = "ة"

حالا میخوام حالاتی رو که تولید میکنم درون یه لیست دیگه بریزم و آخر سر، همه رو به SQL بدم.

Private Shared states As New List(Of String)
Public Shared Sub main(ByVal field As String, value As String)

Dim i = 0, j = 0
Dim token(5) As String
Dim temp
token(0) = "ی"
token(1) = "ي"
token(2) = "ک"
token(3) = "ك"
token(4) = "ه"
token(5) = "ة"

i = 0 : j = 0
While i <= UBound(token)
If value.Contains(token(i)) Or value.Contains(token(i + 1)) Then
temp = value.Replace(token(i), token(i + 1))
states.Add(temp)
temp = value.Replace(token(i + 1), token(i))
states.Add(temp)
End If
i += 2
End While

i = 0 : j = 0
While i <= states.Count - 1
While j < UBound(token)

If states(i).Contains(token(j)) Or states(i).Contains(token(j + 1)) Then
temp = states(i).Replace(token(j), token(j + 1))
states.Add(temp)

temp = temp.Replace(token(j + 1), token(j))
states.Add(temp)
End If
j += 2

End While
i += 1
End While

states = states.Distinct().ToList
End Sub

منتها تمام حالات رو پوشش نمیده.

از دوستان کسی میتونه راهنمایی کنه ؟

یوسف زالی
یک شنبه 22 خرداد 1390, 11:58 صبح
سلام. این کد میاد در تمام جداول تمام حروف ی و ک رو تبدیل می کنه به فارسیش.


DECLARE @Table NVARCHAR(MAX),
@Col NVARCHAR(MAX)

DECLARE Table_Cursor CURSOR
FOR
--پيدا كردن تمام فيلدهاي متني تمام جداول ديتابيس جاري
SELECT a.name, --table
b.name --col
FROM sysobjects a,
syscolumns b
WHERE a.id = b.id
AND a.xtype = 'u' --User table
AND (
b.xtype = 99 --ntext
OR b.xtype = 35 -- text
OR b.xtype = 231 --nvarchar
OR b.xtype = 167 --varchar
OR b.xtype = 175 --char
OR b.xtype = 239 --nchar
)

OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @Table,@Col
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC (
'update [' + @Table + '] set [' + @Col +
']= REPLACE(REPLACE(CAST([' + @Col +
'] as nvarchar(max)) , NCHAR(1740), NCHAR(1610)),NCHAR(1705),NCHAR(1603)) '
)

FETCH NEXT FROM Table_Cursor INTO @Table,@Col
END CLOSE Table_Cursor DEALLOCATE Table_Cursor



شما می تونی با کمی دستکاری یه trigger بگذاری رو جداولت که موقع insert کردن حروف رو درست کنه.
از select کردن هم خیالت راحت میشه.

Developer Programmer
یک شنبه 22 خرداد 1390, 12:10 عصر
ممنون از راهنماییتون ولی نمیتونم دیتابیس رو تغییر بدم یا دستکاریش کنم.

نمیشه یه الگوریتم نوشت که حالات ممکنه رو تولید کنه؟

یوسف زالی
یک شنبه 22 خرداد 1390, 12:56 عصر
در سلکتی که می نویسید کنترل کنید:
یه تابع بنویسید که رشته رو به فرم استاندارد برگردونه.یعنی همه ک ها رو فارسی کنه. تو where که میگذارید فیلد رو تو تابع بیارید.

مسعود اقدسی فام
یک شنبه 22 خرداد 1390, 15:33 عصر
Select * from aTable
Where (Select Replace(Replace(Afield, N'ي', N'ی'), N'ك', N'ک')) Like @param




در این کوئری فیلد aField با حروف فارسی جابجا می‌شه و بعدا با param که خودتون به صورت فارسی وارد می‌کنید مقایسه می‌شه.

Developer Programmer
دوشنبه 23 خرداد 1390, 10:14 صبح
مسعود جان،
ببین، قراره برنامه من، یه جستجوی تحت وب باشه که کاربری که "ك" تایپ میکنه با اونکه "ک" تایپ میکنه، هر دو کار کنن.
اگه من بیام و حروف رو به روش شما تغییر بدم، اونوقت کاربری که در قسمت پارمتر، " ك" تایپ میکنه، نمیتونه نتیجه رو ببینه چون کوئری، اون رو به "ک" تغییر داده.
درسته؟

یوسف زالی
دوشنبه 23 خرداد 1390, 10:25 صبح
شما می تونی تو کوئری قبل از ارسال پارامتر به اس کیو ال، پارامتر رو اصلاح کنی.
بعد از سلکت با تابع یا روشی که دوستمون گفتند استفاده کنید.
param = string with various letters
param = replace vaious letters with unique style
exec query
in select:
where replace...

در ضمن تو Where دوستمون میشه select رو هم حذف کرد

مسعود اقدسی فام
سه شنبه 24 خرداد 1390, 17:56 عصر
مسعود جان،
ببین، قراره برنامه من، یه جستجوی تحت وب باشه که کاربری که "ك" تایپ میکنه با اونکه "ک" تایپ میکنه، هر دو کار کنن.
اگه من بیام و حروف رو به روش شما تغییر بدم، اونوقت کاربری که در قسمت پارمتر، " ك" تایپ میکنه، نمیتونه نتیجه رو ببینه چون کوئری، اون رو به "ک" تغییر داده.
درسته؟

عبارتی رو که کاربر وارد می‌کنه خودتون همه حروفش رو به "ک" و "ی" تبدیل کنید و بعد به این کوئری بدید.