Autor Téma: Firebird - Select, hledání bez ohledu na diakritiku  (Přečteno 1824 krát)

Offline Petr P.

  • Nováček
  • *
  • Příspěvků: 26
  • Karma: 1
    • Verze Delphi: Turbo Delphi 2006
Potřeboval bych hledat v Selectu v podmínce Where bez ohledu na diakritiku (a  je jako á apod). Jde to nějak ?
« Poslední změna: 03-08-2018, 20:43:18 od Petr P. »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2333
  • Karma: 125
    • Verze Delphi: D2007, XE3, DX10
Re:Firebird - Select, hledání bez ohledu na diakritiku
« Odpověď #1 kdy: 03-08-2018, 22:15:37 »
Potřeboval bych hledat v Selectu v podmínce Where bez ohledu na diakritiku (a  je jako á apod). Jde to nějak ?
My na to mame nadefinovanou UDF funkci na strane Firebirdu a analogickou funkci na strane klienta a obe pouzijeme na prislusnych strana vyrazu ve where klauzuli.

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1373
  • Karma: 57
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Firebird - Select, hledání bez ohledu na diakritiku
« Odpověď #2 kdy: 03-08-2018, 22:29:59 »
My na to mame nadefinovanou UDF funkci na strane Firebirdu a analogickou funkci na strane klienta a obe pouzijeme na prislusnych strana vyrazu ve where klauzuli.

V takovych pripadech napr. modul unaccent pro PostgreSQL place ;D
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 533
  • Karma: 36
    • Verze Delphi: 10.2
Re:Firebird - Select, hledání bez ohledu na diakritiku
« Odpověď #3 kdy: 03-08-2018, 23:55:37 »
Také UDF funkce a tatáž funkce na klientovi. Navíc pokud je prohledávaných záznamů hodně (miliony apod.), míváme kromě např. pole Prijmeni jeste indexované pole Prijmeni2, do kterého v triggeru ukládáme tu hodnotu bez diakritiky a pro vyhledávání se pak používá to pole Prijmeni2.

Zmiják

  • Host
Re:Firebird - Select, hledání bez ohledu na diakritiku
« Odpověď #4 kdy: 04-08-2018, 09:16:33 »
Excellent
Rated 1 time
Od FireBirdu v. 2.1 existuje přímé řešení bez potřeby UDF, speciálních sloupečků apod.

Hledejte "WIN_CZ_CI_AI" zde:
https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-appx06-charsets.html#fblangref25-appx06-tbl-charsets

U těch sloupečků, kde to chcete využít je třeba definovat znakovou sadu a řazení.
Můžete to udělat např. pomocí domény a tu potom použít při CREATE TABLE.
CREATE DOMAIN   D_JMENO         VARCHAR(50)   CHARACTER SET WIN1250 COLLATE WIN_CZ_CI_AI;
CREATE DOMAIN   D_PRIJMENI      VARCHAR(70)   CHARACTER SET WIN1250 COLLATE WIN_CZ_CI_AI;


Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 533
  • Karma: 36
    • Verze Delphi: 10.2
Re:Firebird - Select, hledání bez ohledu na diakritiku
« Odpověď #5 kdy: 04-08-2018, 11:15:40 »
Od FireBirdu v. 2.1 existuje přímé řešení bez potřeby UDF, speciálních sloupečků apod.

To se mi bohužel nějak nepovedlo přimět ke správnému řazení písmene "ch" - vždycky mi ho to dávalo pod "c", zatímco uživatelé očekávali, že ho najdou až za "h".

Offline Petr P.

  • Nováček
  • *
  • Příspěvků: 26
  • Karma: 1
    • Verze Delphi: Turbo Delphi 2006
Re:Firebird - Select, hledání bez ohledu na diakritiku
« Odpověď #6 kdy: 04-08-2018, 12:55:32 »
Ta UDF funkce je někde dostupná ?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2333
  • Karma: 125
    • Verze Delphi: D2007, XE3, DX10
Re:Firebird - Select, hledání bez ohledu na diakritiku
« Odpověď #7 kdy: 04-08-2018, 16:09:16 »
Ta UDF funkce je někde dostupná ?
Ta nase neni, protoze k ni nevlastnime dispozicni prava, ale je to funkce v DLL, ktera se da napsat v Delphi viz treba https://delphi.cz/post/64-bitove-UDF-v-RAD-Studio-XE2-pro-FireBird.aspx a v ni vyprasit nejakou funkci napr. ANSI kodovou stranku Win1250, v principu jako je tahle neoptimalizovana:
Kód: Delphi [Vybrat]
  1. function CzOff(CStr: PChar): PChar; cdecl; export;
  2.  const
  3.    CZ='ÁÄÂÉĚËÉÍÝÓÔÖŮÚÜŘŤŠŽĽĹŇČĎ';
  4.    US='AAAEEEEIYOOOUUURTSZLLNCD';
  5.  var
  6.    i,j:integer;  
  7. begin
  8.   CharUpperBuff(CStr, length(CStr));
  9.   for i:=0 to StrLen(CStr)-1 do
  10.   begin
  11.     for j:=1 to length(CZ) do
  12.       if CStr[i]=CZ[j] then
  13.       begin
  14.         CStr[i]:=US[j];
  15.         break;
  16.       end;
  17.    end;  
  18.   end;
  19.   Result:=CStr;
  20.  end;
  21.  

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1373
  • Karma: 57
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Firebird - Select, hledání bez ohledu na diakritiku
« Odpověď #8 kdy: 04-08-2018, 16:13:28 »
Snad by se dalo pouzit i tohle reseni.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2333
  • Karma: 125
    • Verze Delphi: D2007, XE3, DX10
Re:Firebird - Select, hledání bez ohledu na diakritiku
« Odpověď #9 kdy: 04-08-2018, 18:24:32 »
Jeste jsem zapomel poslat tu deklaraci UDF na strane SQL:
Kód: SQL [Vybrat]
  1. DECLARE EXTERNAL FUNCTION CZOFF
  2.     CSTRING(255)
  3.     RETURNS CSTRING(255)
  4.     ENTRY_POINT 'CzOff' MODULE_NAME 'xxxUDF.DLL';
  5.  

Offline Petr P.

  • Nováček
  • *
  • Příspěvků: 26
  • Karma: 1
    • Verze Delphi: Turbo Delphi 2006
Re:Firebird - Select, hledání bez ohledu na diakritiku
« Odpověď #10 kdy: 04-08-2018, 18:34:49 »
Díky

Offline Jirka

  • Mladík
  • **
  • Příspěvků: 62
  • Karma: 5
    • Verze Delphi: XE2
Re:Firebird - Select, hledání bez ohledu na diakritiku
« Odpověď #11 kdy: 06-08-2018, 19:16:40 »
Ahoj
Pouzivam toto :   

function VyhledejPodleNazvu(AText: String): integer;
    var
    Razeni,  ASql:string;
    begin
     if CheckboxDiakritika.Checked then
      Razeni:='COLLATE WIN_CZ_CI_AI' else Razeni:='';


     if  (Length(Trim(AText))>0) then
     ASQL:=Format('SELECT * FROM  VIEW_SKLAD_KARTA_KMEN WHERE (NAZEV_SKLPOL %s) CONTAINING %s ',[Razeni, (PridejUvozovkyAVrat(AText))])
    else
     ASQL:=Format('SELECT * FROM  VIEW_SKLAD_KARTA_KMEN ',[ ]);


    end;


Offline Petr P.

  • Nováček
  • *
  • Příspěvků: 26
  • Karma: 1
    • Verze Delphi: Turbo Delphi 2006
Re:Firebird - Select, hledání bez ohledu na diakritiku
« Odpověď #12 kdy: 07-08-2018, 18:50:15 »
Díky, tohle mi připadá jako lepší řešení než UDF.  Myslel jsem si před tím, že  COLLATE WIN_CZ_CI_A musí být nastavené u jednotlivých údajů v datábázi.
« Poslední změna: 07-08-2018, 18:53:18 od Petr P. »

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1381
  • Karma: 33
    • Pepak.net
Re:Firebird - Select, hledání bez ohledu na diakritiku
« Odpověď #13 kdy: 07-08-2018, 18:58:22 »
Oprav mě, jestli se mýlím, ale podle mě když COLLATION zadáš za běhu, tak se nebudou moci použít indexy.

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1373
  • Karma: 57
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Firebird - Select, hledání bez ohledu na diakritiku
« Odpověď #14 kdy: 07-08-2018, 19:31:32 »
Oprav mě, jestli se mýlím, ale podle mě když COLLATION zadáš za běhu, tak se nebudou moci použít indexy.

To je pravda. Nemohou. Je to nemozne na jakemkoli DBMS. Prvne by totiz musela probehnout konverze. U indexu s danou collation nelze ocekavat indexaci pro jinou collation.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: