• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Tìm Kiếm Trong CSDL

Chuyên mục thảo luận các vấn đề liên quan đến ứng dụng quản lý và cơ sở dữ liệu

Điều hành viên: Điều hành

Hình đại diện của người dùng
vuathongtin
Điều hành viên
Điều hành viên
Bài viết: 1028
Ngày tham gia: CN 02/05/2010 10:03 pm
Đến từ: Xứ sở DG
Has thanked: 2 time
Been thanked: 105 time
Liên hệ:

Tìm Kiếm Trong CSDL

Gửi bàigửi bởi vuathongtin » T.Bảy 06/11/2010 6:02 pm

Nghe bảo là tìm kiếm trong CSDL có phân biệt giữa có dấu và ko dấu phải hok nhỉ , :-?


Bùi Thành Nhân
* Chuyên gia MMO
congtacvien.online

Hình đại diện của người dùng
nimgiaminh
Thành viên danh dự
Thành viên danh dự
Bài viết: 432
Ngày tham gia: T.Bảy 07/08/2010 9:24 am
Đến từ: Ở dưới đó đó
Has thanked: 6 time
Been thanked: 18 time
Liên hệ:

Re: Tìm Kiếm Trong CSDL

Gửi bàigửi bởi nimgiaminh » CN 07/11/2010 11:05 pm

Em có làm bài về tìm kiếm trong CSDL SQL Server, nếu tìm là DON thì nó ra, nếu tìm bằng Đơn thì nó chẳng cho ra cái gì. :(( :(( :(( . Thế là em phải tạo hàm để kiểm tra dữ liệu nhập vào là có dấu hay ko. Không biết các CSDL khác có bị như vậy hay ko???

Hình đại diện của người dùng
lungocqua
Guru
Guru
Bài viết: 1225
Ngày tham gia: T.Ba 18/08/2009 11:51 am
Đến từ: Phú Hữu - Nhơn Trạch - Đồng Nai
Been thanked: 5 time
Liên hệ:

Re: Tìm Kiếm Trong CSDL

Gửi bàigửi bởi lungocqua » T.Hai 08/11/2010 4:12 pm

Đúng là có phân biệt theo dấu. Ví dụ như trong CSDL lưu là thương thì gõ tìm thuong mà dùng lệnh like để so thì sẽ không tìm ra. :D Muốn biết là đúng hay không thì cứ làm thử là biết liền chứ gì!
Mình có ý tưởng là tách dấu rồi sau đó sẽ tìm. Cái việc này nằm trong mục tùy chọn tìm kiếm chính xác hay là tương đối cho người dùng lựa chọn. Nếu chính xác thì dùng dấu bằng còn tương đối thì dùng like mà chắc dấu bằng thì ít ai dùng nhỉ! :D Nếu vậy thì còn một mục tùy chọn nữa là tách dấu, lúc đó không phận biệt chữ tiếng Việt hay không tiếng Việt! Tách dấu từ cần tìm, sau đó tách hết dấu của từ cần so. Dùng vòng lặp thôi. Cần so từ nào thì tách dấu từ đó! Việc này nhẹ nhàng mà! :)
Còn code tách thì trong diễn đàn cũng có luôn rồi. :)
Sửa lần cuối bởi lungocqua vào ngày T.Hai 08/11/2010 4:20 pm với 1 lần sửa.
Ta đã trở lại và quên hết tất cả! :D

Hình đại diện của người dùng
nimgiaminh
Thành viên danh dự
Thành viên danh dự
Bài viết: 432
Ngày tham gia: T.Bảy 07/08/2010 9:24 am
Đến từ: Ở dưới đó đó
Has thanked: 6 time
Been thanked: 18 time
Liên hệ:

Re: Tìm Kiếm Trong CSDL

Gửi bàigửi bởi nimgiaminh » T.Hai 08/11/2010 4:19 pm

Đơn giản quá hen, anh mà nói thêm xíu nữa là em khùng khùng lun đó, anh đưa VD thử đi anh.

Hình đại diện của người dùng
lungocqua
Guru
Guru
Bài viết: 1225
Ngày tham gia: T.Ba 18/08/2009 11:51 am
Đến từ: Phú Hữu - Nhơn Trạch - Đồng Nai
Been thanked: 5 time
Liên hệ:

Re: Tìm Kiếm Trong CSDL

Gửi bàigửi bởi lungocqua » T.Hai 08/11/2010 4:23 pm

Nè! Ví dụ trong CSDl lưu là Nguyễn Hoài Anh chẳng hạn thì ghi gõ tìm kiếm với từ khóa là nguyen thì sẽ không tìm ra. Lúc đó thì lượt bỏ dấu của từ kia nó sẽ được là Nguyen Hoai Anh và khi đó tìm thì sẽ ra thôi! :D
Ta đã trở lại và quên hết tất cả! :D

Hình đại diện của người dùng
nimgiaminh
Thành viên danh dự
Thành viên danh dự
Bài viết: 432
Ngày tham gia: T.Bảy 07/08/2010 9:24 am
Đến từ: Ở dưới đó đó
Has thanked: 6 time
Been thanked: 18 time
Liên hệ:

Re: Tìm Kiếm Trong CSDL

Gửi bàigửi bởi nimgiaminh » T.Hai 08/11/2010 4:25 pm

Vậy theo anh thì bỏ dấu bằng cách nào??? Trong sql co không???

Hình đại diện của người dùng
lungocqua
Guru
Guru
Bài viết: 1225
Ngày tham gia: T.Ba 18/08/2009 11:51 am
Đến từ: Phú Hữu - Nhơn Trạch - Đồng Nai
Been thanked: 5 time
Liên hệ:

Re: Tìm Kiếm Trong CSDL

Gửi bàigửi bởi lungocqua » T.Hai 08/11/2010 5:24 pm

Bằng code thôi. Trong SQL thì mình chưa biết! (có dùng đâu mà biết :D)
Tập tin đính kèm
Chuong trinh loc bo dau tieng Viet.ZIP
(vb2003)
(43.41 KiB) Đã tải 668 lần
Ta đã trở lại và quên hết tất cả! :D

Hình đại diện của người dùng
nimgiaminh
Thành viên danh dự
Thành viên danh dự
Bài viết: 432
Ngày tham gia: T.Bảy 07/08/2010 9:24 am
Đến từ: Ở dưới đó đó
Has thanked: 6 time
Been thanked: 18 time
Liên hệ:

Re: Tìm Kiếm Trong CSDL

Gửi bàigửi bởi nimgiaminh » T.Hai 08/11/2010 5:29 pm

Anh giải thích giùm em cái này được ko anh??
Em chỉ hiểu sơ sơ thui, chứ chưa hiểu kỹ, em dốt thuật toán lắm. :-O :-O

mistrylen
Thành viên chính thức
Thành viên chính thức
Bài viết: 36
Ngày tham gia: T.Bảy 11/09/2010 10:16 am
Been thanked: 3 time

Re: Tìm Kiếm Trong CSDL

Gửi bàigửi bởi mistrylen » T.Ba 20/12/2011 1:17 pm

Ví dụ, ngoài lưu trường [Họ tên], bạn lưu thêm một trường [ho ten] nữa để phục vụ cho tìm kiếm.
Khi nhập chuỗi cần tìm vào textbox, chương trình sẽ chuyển chuỗi này thành tiếng việt không dấu, rồi tìm kiếm chuỗi không dấu này trong trường [ho ten] đã lưu ở trên.

Hình đại diện của người dùng
chethanhtu2011
Thành viên tích cực
Thành viên tích cực
Bài viết: 148
Ngày tham gia: T.Ba 16/08/2011 10:25 am
Đến từ: tp Cao Lãnh - Đồng Tháp
Has thanked: 21 time
Been thanked: 6 time
Liên hệ:

Re: Tìm Kiếm Trong CSDL

Gửi bàigửi bởi chethanhtu2011 » T.Ba 17/01/2012 2:44 pm

lungocqua đã viết:Nè! Ví dụ trong CSDl lưu là Nguyễn Hoài Anh chẳng hạn thì ghi gõ tìm kiếm với từ khóa là nguyen thì sẽ không tìm ra. Lúc đó thì lượt bỏ dấu của từ kia nó sẽ được là Nguyen Hoai Anh và khi đó tìm thì sẽ ra thôi! :D

Cần chi phải lọc lẹo gì cho vất vả vậy, bạn cứ like '%' +TuKhoa '%' là ra hết, lúc này nó chỉ cần thấy chữ Anh là ra Nguyễn Hoài Anh rồi.

Tìm kiếm chỉ cần Like theo từ khóa cần tìm là được. Chủ đề này nên đặt tên là "Lọc dấu trong SQL" thì mới đúng theo cách bàn luận xuyên suốt từ trên xuống dưới của các bác :D

Hình đại diện của người dùng
chethanhtu2011
Thành viên tích cực
Thành viên tích cực
Bài viết: 148
Ngày tham gia: T.Ba 16/08/2011 10:25 am
Đến từ: tp Cao Lãnh - Đồng Tháp
Has thanked: 21 time
Been thanked: 6 time
Liên hệ:

Re: Tìm Kiếm Trong CSDL

Gửi bàigửi bởi chethanhtu2011 » T.Ba 17/01/2012 2:49 pm

Vậy cách thảo luận mới cho chủ đề này là:

Các bác hảy giúp tớ, viết một procedure với đầu vào là một chuỗi bất kì có dâu. Đầu ra là một chuỗi đã loại bỏ hết dâu của nó. Vậy là ý tưởng tách dâu để tim kiếm của các bác sẽ sáng tỏ thôi.

Ai sung phong viết nào !

FlyingFox
Guru
Guru
Bài viết: 812
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 322 time

Re: Tìm Kiếm Trong CSDL

Gửi bàigửi bởi FlyingFox » T.Hai 06/02/2012 10:34 am

Có thễ làm theo những trường hợp sau đây:

1. Khi setup SQL Sever thì nên chọn collation là SQL_Latin1_General_CP1_CI_AI.

2. Hoặc đỗi column cần tìm collation sang thành SQL_Latin1_General_CP1_CI_AI
  1. ALTER TABLE SinhVien
  2. ALTER COLUMN HoTen NVARCHAR(125)
  3. COLLATE SQL_Latin1_General_CP1_CI_AI


Khi đó thì chĩ cần viết query cho cã 2 trường hợp trên
  1. SELECT * FROM SinhVien WHERE HoTen LIKE '%tran%' OR HoTen LIKE '%van%'


3. Dùng Collate trong query
  1. SELECT *
  2. FROM SinhVien
  3. WHERE HoTen COLLATE SQL_Latin1_General_CP1_CI_AI LIKE '%tran%'


4.Còn nếu muốn function đễ loại bõ dấu thì viết 2 function sau:
  1. CREATE FUNCTION fn_replace_charset
  2. (
  3.     @expression nvarchar(MAX),
  4.     @pattern    nvarchar(MAX),
  5.     @REPLACE    nvarchar(1)
  6. )
  7. RETURNS nvarchar(MAX)
  8. AS
  9. BEGIN
  10.     WHILE PATINDEX(@pattern, @expression) > 0
  11.       SET @expression = REPLACE(@expression, SUBSTRING(@expression, PATINDEX(@pattern, @expression), 1), @REPLACE)
  12.     RETURN @expression
  13. END
  14. GO
  15.  
  16. CREATE FUNCTION fn_vn_non_uicode
  17.                 (@str nvarchar(MAX)) RETURNS nvarchar(MAX)
  18. AS BEGIN
  19.    
  20.     DECLARE @pattern nvarchar(50)
  21.     SET @pattern = N'%[á-àạảãâấầậẩẫăắằặẳẵ]%'
  22.     SET @str = dbo.fn_replace_charset(@str, @pattern, 'a')
  23.  
  24.     SET @pattern = N'%[é-èẹẻẽêếềệểễ]%'
  25.     SET @str = dbo.fn_replace_charset(@str, @pattern, 'e')
  26.  
  27.     SET @pattern = N'%[ó-òọỏõôốồộổỗơớờợởỡ]%'
  28.     SET @str = dbo.fn_replace_charset(@str, @pattern, 'o')
  29.  
  30.     SET @pattern = N'%[ú-ùụủũưứừựửữ]%'
  31.     SET @str = dbo.fn_replace_charset(@str, @pattern, 'u')
  32.  
  33.     SET @pattern = N'%[í-ìịỉĩ]%'
  34.     SET @str = dbo.fn_replace_charset(@str, @pattern, 'i')
  35.  
  36.     SET @pattern = N'%[ý-ỳỵỷỹ]%'
  37.     SET @str = dbo.fn_replace_charset(@str, @pattern, 'y')
  38.  
  39.     SET @pattern = N'%đ%'
  40.     SET @str = dbo.fn_replace_charset(@str, @pattern, 'd')
  41.    
  42.     RETURN @str
  43. END
  44. GO


-- Chuyễn đỗi thành không dấu
  1. DECLARE @str NVARCHAR(MAX)
  2. SET @str = N'Câu lạc bộ Visual Basic'
  3. SELECT dbo.fn_vn_non_uicode(@str)


Hay viết câu search như 2 trường hợp trên như sau
  1. SELECT HoTen FROM SinhVien WHERE dbo.fn_vn_non_uicode(HoTen) LIKE '%tran%' OR dbo.fn_vn_non_uicode(HoTen) LIKE '%van%'


5. Viết CLR stored procedure đễ lọai bõ dấu.

Hình đại diện của người dùng
chethanhtu2011
Thành viên tích cực
Thành viên tích cực
Bài viết: 148
Ngày tham gia: T.Ba 16/08/2011 10:25 am
Đến từ: tp Cao Lãnh - Đồng Tháp
Has thanked: 21 time
Been thanked: 6 time
Liên hệ:

Re: Tìm Kiếm Trong CSDL

Gửi bàigửi bởi chethanhtu2011 » T.Năm 23/02/2012 11:11 pm

vuathongtin đã viết:Nghe bảo là tìm kiếm trong CSDL có phân biệt giữa có dấu và ko dấu phải hok nhỉ , :-?

Code lọc dấu trong sql
  1.  
  2. Create FUNCTION fNoSign
  3. (
  4.       @strInput NVARCHAR(4000)
  5. )
  6. RETURNS NVARCHAR(4000)
  7. AS
  8. Begin
  9.     -- Lọc các ký tự đặc biệt
  10.     Set @strInput=lower(@strInput)
  11.     IF @strInput IS NULL RETURN @strInput
  12.     IF @strInput = '' RETURN @strInput
  13.     Declare @text nvarchar(50), @i int
  14.     Set @text='-''`~!@#$%^&*()?><:|}{,./\"''='''
  15.     Select @i= PATINDEX('%['+@text+']%',@strInput )
  16.     while @i > 0
  17.         begin
  18.             set @strInput = replace(@strInput, substring(@strInput, @i, 1), '')
  19.             set @i = patindex('%['+@text+']%', @strInput)
  20.         End
  21.         Set @strInput =replace(@strInput,'  ',' ')
  22.        
  23.     DECLARE @RT NVARCHAR(4000)
  24.     DECLARE @SIGN_CHARS NCHAR(136)
  25.     DECLARE @UNSIGN_CHARS NCHAR (136)
  26.     SET @SIGN_CHARS = N'ăâđêôơưàảãạáằẳẵặắầẩẫậấèẻẽẹéềểễệế
  27.                  ìỉĩịíòỏõọóồổỗộốờởỡợớùủũụúừửữựứỳỷỹỵý'
  28.                   +NCHAR(272)+ NCHAR(208)
  29.     SET @UNSIGN_CHARS = N'aadeoouaaaaaaaaaaaaaaaeeeeeeeeee
  30.                  iiiiiooooooooooooooouuuuuuuuuuyyyyy'
  31.     DECLARE @COUNTER int
  32.     DECLARE @COUNTER1 int
  33.     SET @COUNTER = 1
  34.     WHILE (@COUNTER <=LEN(@strInput))
  35.     BEGIN  
  36.       SET @COUNTER1 = 1
  37.        WHILE (@COUNTER1 <=LEN(@SIGN_CHARS)+1)
  38.        BEGIN
  39.      IF UNICODE(SUBSTRING(@SIGN_CHARS, @COUNTER1,1))
  40.             = UNICODE(SUBSTRING(@strInput,@COUNTER ,1) )
  41.      BEGIN          
  42.           IF @COUNTER=1
  43.               SET @strInput = SUBSTRING(@UNSIGN_CHARS, @COUNTER1,1)
  44.               + SUBSTRING(@strInput, @COUNTER+1,LEN(@strInput)-1)                  
  45.           ELSE
  46.               SET @strInput = SUBSTRING(@strInput, 1, @COUNTER-1)
  47.               +SUBSTRING(@UNSIGN_CHARS, @COUNTER1,1)
  48.               + SUBSTRING(@strInput, @COUNTER+1,LEN(@strInput)- @COUNTER)
  49.               BREAK
  50.                END
  51.              SET @COUNTER1 = @COUNTER1 +1
  52.        END
  53.        SET @COUNTER = @COUNTER +1
  54.     End
  55.     RETURN lower(@strInput)
  56. End
  57.  
  58.  


thực thi
  1. select dbo.fNoSign (N'Chế Thanh Tú')

Kết quả:
Tập tin đính kèm
locdau.JPG
locdau.JPG (10.92 KiB) Đã xem 3415 lần


Quay về “Ứng dụng Quản lý và Cơ sở dữ liệu”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.7 khách