Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Làm sao để select cả tiếng việt có dấu và không dấu trong oracle

  1. #1
    Ngày gia nhập
    08 2011
    Bài viết
    3

    Mặc định Làm sao để select cả tiếng việt có dấu và không dấu trong oracle

    VD từ khóa là BINH thì kết quả trả về bao gồm cả BÌNH, BINH, binh, bình, Bình ... Ai biết chỉ giúp mình với

  2. #2
    Ngày gia nhập
    08 2010
    Nơi ở
    Hồ Chí Minh
    Bài viết
    131

    Hy vọng sẽ giúp được bạn

    Đầu tiên bạn cần phải tạo 1 function để chuyển tiến việt có dấu thành không dấu
    Oracle SQL Code:
    1. CREATE OR REPLACE FUNCTION FN_CONVERT_TO_VN
    2. (
    3.      STRINPUT IN NVARCHAR2
    4. )
    5. RETURN NVARCHAR2
    6. IS
    7.   STRCONVERT NVARCHAR2(32527);
    8. BEGIN
    9.   STRCONVERT := TRANSLATE(
    10.                              STRINPUT,
    11.                              'áàảãạăắằẳẵặâấầẩẫậđéèẻẽẹêếềểễệíìỉĩịóòỏõọôốồổỗộơớờởỡợúùủũụưứừửữựýỳỷỹỵÁÀẢÃẠĂẮẰẲẴẶÂẤẦẨẪẬĐÉÈẺẼẸÊẾỀỂỄỆÍÌỈĨỊÓÒỎÕỌÔỐỒỔỖỘƠỚỜỞỠỢÚÙỦŨỤƯỨỪỬỮỰÝỲỶỸỴ',
    12.                              'aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyyAAAAAAAAAAAAAAAAADEEEEEEEEEEEIIIIIOOOOOOOOOOOOOOOOOUUUUUUUUUUUYYYYY'
    13.                            );
    14.   RETURN STRCONVERT;
    15. END;

    Sau đó bạn viết thêm cái Package tìm kiếm như sau, ở đây mình chỉ lấy ví dụ thôi nhe
    Oracle SQL Code:
    1. PROCEDURE PROC_SEARCH
    2.   (
    3.     P_STRING  IN   NVARCHAR2,
    4.     P_OUT     OUT  T_CURSOR
    5.   )
    6.   AS
    7.   BEGIN
    8.     OPEN P_OUT FOR
    9.     SELECT *
    10.     FROM KHACHHANG
    11.     WHERE UPPER(FN_CONVERT_TO_VN(TENKH)) LIKE '%' || UPPER(P_STRING) || '%' OR UPPER(TENKH) = '%' || UPPER(P_STRING) || '%';
    12.   END PROC_SEARCH;

    Làm theo cách này bạn có thể tìm được kết quả có dấu và không dấu lun cũng rất hay. Tuy nhiên nếu dữ liệu bạn ít chừng vài trăm ngàn dòng thì ok
    Nếu mà dữ liệu bạn lớn khoản vài chục triệu dòng thì toán tử LIKE sẽ làm cho câu query của bạn trở nên chậm đi

  3. #3
    Ngày gia nhập
    08 2011
    Bài viết
    3

    Trích dẫn Nguyên bản được gửi bởi vnlevanduoc Xem bài viết
    Hy vọng sẽ giúp được bạn

    Đầu tiên bạn cần phải tạo 1 function để chuyển tiến việt có dấu thành không dấu
    Oracle SQL Code:
    1. CREATE OR REPLACE FUNCTION FN_CONVERT_TO_VN
    2. (
    3.      STRINPUT IN NVARCHAR2
    4. )
    5. RETURN NVARCHAR2
    6. IS
    7.   STRCONVERT NVARCHAR2(32527);
    8. BEGIN
    9.   STRCONVERT := TRANSLATE(
    10.                              STRINPUT,
    11.                              'áàảãạăắằẳẵặâấầẩẫậđéèẻẽẹêếềểễệíìỉĩịóòỏõọôốồổỗộơớờởỡợúùủũụưứừửữựýỳỷỹỵÁÀẢÃẠĂẮẰẲẴẶÂẤẦẨẪẬĐÉÈẺẼẸÊẾỀỂỄỆÍÌỈĨỊÓÒỎÕỌÔỐỒỔỖỘƠỚỜỞỠỢÚÙỦŨỤƯỨỪỬỮỰÝỲỶỸỴ',
    12.                              'aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyyAAAAAAAAAAAAAAAAADEEEEEEEEEEEIIIIIOOOOOOOOOOOOOOOOOUUUUUUUUUUUYYYYY'
    13.                            );
    14.   RETURN STRCONVERT;
    15. END;

    Sau đó bạn viết thêm cái Package tìm kiếm như sau, ở đây mình chỉ lấy ví dụ thôi nhe
    Oracle SQL Code:
    1. PROCEDURE PROC_SEARCH
    2.   (
    3.     P_STRING  IN   NVARCHAR2,
    4.     P_OUT     OUT  T_CURSOR
    5.   )
    6.   AS
    7.   BEGIN
    8.     OPEN P_OUT FOR
    9.     SELECT *
    10.     FROM KHACHHANG
    11.     WHERE UPPER(FN_CONVERT_TO_VN(TENKH)) LIKE '%' || UPPER(P_STRING) || '%' OR UPPER(TENKH) = '%' || UPPER(P_STRING) || '%';
    12.   END PROC_SEARCH;

    Làm theo cách này bạn có thể tìm được kết quả có dấu và không dấu lun cũng rất hay. Tuy nhiên nếu dữ liệu bạn ít chừng vài trăm ngàn dòng thì ok
    Nếu mà dữ liệu bạn lớn khoản vài chục triệu dòng thì toán tử LIKE sẽ làm cho câu query của bạn trở nên chậm đi
    cảm ơn a nhiều, đúng là tốc độ giảm đi, có cách nào cải thiện kg a

  4. #4
    Ngày gia nhập
    08 2010
    Nơi ở
    Hồ Chí Minh
    Bài viết
    131

    Trích dẫn Nguyên bản được gửi bởi nhduy Xem bài viết
    cảm ơn a nhiều, đúng là tốc độ giảm đi, có cách nào cải thiện kg a
    Trong Oracle mình có thể đặt INDEX cho 1 trường nào đó như "Name, Primary Key, ...." nếu như table của bạn ăn index rồi thì câu query sẽ đc tăng tốc độ đáng kể đó.

    Thậm chí nếu đặt index thì lệnh select cũng nhanh hơn hẳn bạn có thể thử đặt INDEX xem có thể giúp được bạn hok!

    Còn nếu cảm thấy nó vẫn chưa đáp ứng như cầu của bạn thì bạn có thể đặt Parttion cho Table điều này cũng làm tăng tốc độ khi query đó bạn

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn