• 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

Moderator: Điều hành

User avatar
vuathongtin
Điều hành viên
Điều hành viên
Posts: 1028
Joined: Sun 02/05/2010 10:03 pm
Location: Xứ sở DG
Has thanked: 2 times
Been thanked: 105 times
Contact:

Tìm Kiếm Trong CSDL

Postby vuathongtin » Sat 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

User avatar
nimgiaminh
Thành viên danh dự
Thành viên danh dự
Posts: 432
Joined: Sat 07/08/2010 9:24 am
Location: Ở dưới đó đó
Has thanked: 6 times
Been thanked: 18 times
Contact:

Re: Tìm Kiếm Trong CSDL

Postby nimgiaminh » Sun 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???

User avatar
lungocqua
Guru
Guru
Posts: 1225
Joined: Tue 18/08/2009 11:51 am
Location: Phú Hữu - Nhơn Trạch - Đồng Nai
Been thanked: 5 times
Contact:

Re: Tìm Kiếm Trong CSDL

Postby lungocqua » Mon 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. :)
Last edited by lungocqua on Mon 08/11/2010 4:20 pm, edited 1 time in total.
Ta đã trở lại và quên hết tất cả! :D

User avatar
nimgiaminh
Thành viên danh dự
Thành viên danh dự
Posts: 432
Joined: Sat 07/08/2010 9:24 am
Location: Ở dưới đó đó
Has thanked: 6 times
Been thanked: 18 times
Contact:

Re: Tìm Kiếm Trong CSDL

Postby nimgiaminh » Mon 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.

User avatar
lungocqua
Guru
Guru
Posts: 1225
Joined: Tue 18/08/2009 11:51 am
Location: Phú Hữu - Nhơn Trạch - Đồng Nai
Been thanked: 5 times
Contact:

Re: Tìm Kiếm Trong CSDL

Postby lungocqua » Mon 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

User avatar
nimgiaminh
Thành viên danh dự
Thành viên danh dự
Posts: 432
Joined: Sat 07/08/2010 9:24 am
Location: Ở dưới đó đó
Has thanked: 6 times
Been thanked: 18 times
Contact:

Re: Tìm Kiếm Trong CSDL

Postby nimgiaminh » Mon 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???

User avatar
lungocqua
Guru
Guru
Posts: 1225
Joined: Tue 18/08/2009 11:51 am
Location: Phú Hữu - Nhơn Trạch - Đồng Nai
Been thanked: 5 times
Contact:

Re: Tìm Kiếm Trong CSDL

Postby lungocqua » Mon 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)
Attachments
Chuong trinh loc bo dau tieng Viet.ZIP
(vb2003)
(43.41 KiB) Downloaded 677 times
Ta đã trở lại và quên hết tất cả! :D

User avatar
nimgiaminh
Thành viên danh dự
Thành viên danh dự
Posts: 432
Joined: Sat 07/08/2010 9:24 am
Location: Ở dưới đó đó
Has thanked: 6 times
Been thanked: 18 times
Contact:

Re: Tìm Kiếm Trong CSDL

Postby nimgiaminh » Mon 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
Posts: 36
Joined: Sat 11/09/2010 10:16 am
Been thanked: 3 times

Re: Tìm Kiếm Trong CSDL

Postby mistrylen » Tue 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.

User avatar
chethanhtu2011
Thành viên tích cực
Thành viên tích cực
Posts: 148
Joined: Tue 16/08/2011 10:25 am
Location: tp Cao Lãnh - Đồng Tháp
Has thanked: 21 times
Been thanked: 6 times
Contact:

Re: Tìm Kiếm Trong CSDL

Postby chethanhtu2011 » Tue 17/01/2012 2:44 pm

lungocqua wrote: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

User avatar
chethanhtu2011
Thành viên tích cực
Thành viên tích cực
Posts: 148
Joined: Tue 16/08/2011 10:25 am
Location: tp Cao Lãnh - Đồng Tháp
Has thanked: 21 times
Been thanked: 6 times
Contact:

Re: Tìm Kiếm Trong CSDL

Postby chethanhtu2011 » Tue 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
Posts: 831
Joined: Wed 20/04/2011 9:56 am
Been thanked: 325 times

Re: Tìm Kiếm Trong CSDL

Postby FlyingFox » Mon 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
[sql]select * from SinhVien where HoTen LIKE '%tran%' or HoTen LIKE '%van%'[/sql]

3. Dùng Collate trong query
[sql]SELECT *
FROM SinhVien
WHERE HoTen COLLATE SQL_Latin1_General_CP1_CI_AI like '%tran%'[/sql]

4.Còn nếu muốn function đễ loại bõ dấu thì viết 2 function sau:
[sql]CREATE FUNCTION fn_replace_charset
(
@expression nvarchar(max),
@pattern nvarchar(max),
@replace nvarchar(1)
)
RETURNS nvarchar(max)
AS
BEGIN
WHILE PATINDEX(@pattern, @expression) > 0
SET @expression = REPLACE(@expression, SUBSTRING(@expression, PATINDEX(@pattern, @expression), 1), @replace)
RETURN @expression
END
GO

CREATE function fn_vn_non_uicode
(@str nvarchar(max)) returns nvarchar(max)
AS BEGIN

declare @pattern nvarchar(50)
set @pattern = N'%[á-àạảãâấầậẩẫăắằặẳẵ]%'
set @str = dbo.fn_replace_charset(@str, @pattern, 'a')

set @pattern = N'%[é-èẹẻẽêếềệểễ]%'
set @str = dbo.fn_replace_charset(@str, @pattern, 'e')

set @pattern = N'%[ó-òọỏõôốồộổỗơớờợởỡ]%'
set @str = dbo.fn_replace_charset(@str, @pattern, 'o')

set @pattern = N'%[ú-ùụủũưứừựửữ]%'
set @str = dbo.fn_replace_charset(@str, @pattern, 'u')

set @pattern = N'%[í-ìịỉĩ]%'
set @str = dbo.fn_replace_charset(@str, @pattern, 'i')

set @pattern = N'%[ý-ỳỵỷỹ]%'
set @str = dbo.fn_replace_charset(@str, @pattern, 'y')

set @pattern = N'%đ%'
set @str = dbo.fn_replace_charset(@str, @pattern, 'd')

return @str
END
GO[/sql]

-- Chuyễn đỗi thành không dấu
[sql]DECLARE @str NVARCHAR(max)
SET @str = N'Câu lạc bộ Visual Basic'
select dbo.fn_vn_non_uicode(@str)[/sql]

Hay viết câu search như 2 trường hợp trên như sau
[sql]select HoTen from SinhVien where dbo.fn_vn_non_uicode(HoTen) like '%tran%' or dbo.fn_vn_non_uicode(HoTen) like '%van%'[/sql]

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

User avatar
chethanhtu2011
Thành viên tích cực
Thành viên tích cực
Posts: 148
Joined: Tue 16/08/2011 10:25 am
Location: tp Cao Lãnh - Đồng Tháp
Has thanked: 21 times
Been thanked: 6 times
Contact:

Re: Tìm Kiếm Trong CSDL

Postby chethanhtu2011 » Thu 23/02/2012 11:11 pm

vuathongtin wrote: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 [csharp]select dbo.fNoSign (N'Chế Thanh Tú')[/csharp]
Kết quả:
Attachments
locdau.JPG
locdau.JPG (10.92 KiB) Viewed 3616 times


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

Who is online

Users browsing this forum: No registered users and 3 guests