Forum Delphi.cz

Databáze => Firebird a Interbase => Téma založeno: Petr P. 03-08-2018, 20:37:46

Název: Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: Petr P. 03-08-2018, 20:37:46
Potřeboval bych hledat v Selectu v podmínce Where bez ohledu na diakritiku (a  je jako á apod). Jde to nějak ?
Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: pf1957 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.
Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: Delfin 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 (https://www.postgresql.org/docs/current/static/unaccent.html) pro PostgreSQL place ;D
Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: vandrovnik 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.
Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: Zmiják 04-08-2018, 09:16:33
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 (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;

Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: vandrovnik 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".
Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: Petr P. 04-08-2018, 12:55:32
Ta UDF funkce je někde dostupná ?
Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: pf1957 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 (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.  
Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: Delfin 04-08-2018, 16:13:28
Snad by se dalo pouzit i tohle reseni (https://stackoverflow.com/a/1892432).
Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: pf1957 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.  
Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: Petr P. 04-08-2018, 18:34:49
Díky
Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: Jirka 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;

Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: Petr P. 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.
Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: pepak 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.
Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: Delfin 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.
Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: Jirka 08-08-2018, 16:53:21
IMHO
Pole kde vyhledávím podle diakritiky (např. název produktu) nejsou ve většině případů stejně zaindexované (alespoň u mě :-) )
Název: Re:Firebird - Select, hledání bez ohledu na diakritiku
Přispěvatel: Delfin 08-08-2018, 18:17:26
IMHO
Pole kde vyhledávím podle diakritiky (např. název produktu) nejsou ve většině případů stejně zaindexované (alespoň u mě :-) )

Pro tyto pripady se pouzivaji fulltext search moduly. Napr. PostgreSQL ma kvalitni fulltext search modul. Ale to uz je jina liga ;)