suchen nach Wert in allen Tabellen

Themen rund um den praktischen Einsatz von Firebird. Fragen zu SQL, Performance, Datenbankstrukturen, etc.

Moderator: thorben.braun

Antworten
haederli
Beiträge: 8
Registriert: Mi 10. Okt 2018, 13:20

Hallo zusammen
kent jemand den SQL String, mit dem ich in allen Tabellen nach einen Wert suchen kann.

Gruss aus CH
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Hallo,

das ist prinzipiell über eine Prozedur möglich. Mit einem einfachen SQL-Statement kommst du da leider nicht weiter. Du musst die DDL-Struktur der Datenbank holen, also die Tabellen und zugehörigen Felder und in anschließend separaten Statements nach deinem Wert suchen. Vielleicht hat ja schon jemand ein passendes SQL-Konstrukt parat.

Gruß
Martin
Martin Köditz
it & synergy GmbH
bfuerchau
Beiträge: 485
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Das alleine reicht ja nicht aus, da ja auch in jeder Tabelle das/die Feld/er unterschiedlich sind.
Besser wäre, der Aufgabenstellung entsprechend, dies über einen Union-Select zu lösen:

select 'TableA' as Id, a.Feldx from TableA a where ....
union all
select 'TableB' as Id, a.Feldy from TableB a where ....
union all
select 'TableC' as Id, a.Feldz from TableC a where ....
:
:
Über das Feld "Id" weiß ich dann zumindest, wo die gelesenen Informationen herkommen, wenn es dann benötigt wird.
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Ich hatte mal einen Ansatz gesehen in dem dynamisch eine VIEW generiert und dann abgefragt wird. Damit ist das Feld dann (fast) egal. Vielleicht finde ich das Konstrukt noch in den Untiefen meiner Festplatte.

Gruß
Martin
Martin Köditz
it & synergy GmbH
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Guten Morgen,

ich habe folgende Lösung. Dabei werden alle Tabellen und deren Felder durchlaufen. Ausgegeben werden der Tabellenname, das Feld, die Anzahl der Treffer und, der Bequemlichkeit halber, das SQL-Statement für die spätere manuelle Abfrage.
Zunächst habe ich folgende selektierbare Prozedur:

Code: Alles auswählen

SET TERM ^^ ;

CREATE PROCEDURE PRC_FINDSTRINGINTABLE (
    STRTOFIND VARCHAR(255)
)
RETURNS (
  TABLENAME VARCHAR(31),
  COLNAME VARCHAR(31),
  OCCURENCE INT,
  SQL_COMMAND VARCHAR(1000)
)
AS
DECLARE VARIABLE sqlCommandCount VARCHAR(1000);
DECLARE VARIABLE sqlCommandTmp VARCHAR(1000);
begin

  -- Alle Tabellen durchlaufen
  for select trim(rdb$relation_name)
    from rdb$relations
    where rdb$view_blr is null
    and COALESCE(rdb$system_flag, 0) = 0
    order by 1
    into :TABLENAME
  do
  BEGIN
  
        -- In jedem Feld der Tabelle nach dem Wert suchen.
        for select trim(RDB$RELATION_FIELDS.rdb$field_name) as NC 
            from RDB$RELATION_FIELDS 
            where RDB$RELATION_FIELDS.rdb$relation_name = upper(:TABLENAME)
            into :COLNAME  
        do begin
        
            -- Anzeige des SQL-Befehls zur späteren Abfrage
            SQL_COMMAND = 'SELECT * FROM ' || :TABLENAME || ' WHERE ' || :COLNAME || ' LIKE ''%' || :STRTOFIND || '%'';';
        
            -- Anzahl der Zeilen abfragen 
            sqlCommandCount = 'SELECT 
                                COUNT(*) as ANZAHL
                                FROM ' || :TABLENAME || ' WHERE ' || :COLNAME || ' LIKE ''%' || :STRTOFIND || '%'';';   
            
            EXECUTE STATEMENT sqlCommandCount
            into :OCCURENCE;
            
            -- Datenzeile ausgeben
            SUSPEND;
        end
  
  END

end ^^


SET TERM ; ^^
Diese kann ich nun nach meinem Suchbegriff abfragen:

Code: Alles auswählen

SELECT * FROM PRC_FINDSTRINGINTABLE('Braun')
WHERE OCCURENCE > 0;
Nun werden mir alle Tabellen und deren Felder mit mindestens einem Treffer angezeigt.

Code: Alles auswählen

TABLENAME		COLNAME			OCCURENCE	SQL_COMMAND
TBL_BUSINESS_ADDRESS	ADDRESS_DISPLAY_NAME	56		SELECT * FROM TBL_BUSINESS_ADDRESS WHERE ADDRESS_DISPLAY_NAME LIKE '%Braun%';
TBL_BUSINESS_ADDRESS	ADDRESS1	   	25		SELECT * FROM TBL_BUSINESS_ADDRESS WHERE ADDRESS1 LIKE '%Braun%';
TBL_BUSINESS_ADDRESS	ADDRESS2		1		SELECT * FROM TBL_BUSINESS_ADDRESS WHERE ADDRESS2 LIKE '%Braun%';

Bitte beachtet, dass die Suche Groß- und Kleinschreibung unterscheided. Ggf. kann "LIKE" durch CONTAINING ersetzt werden. Dann wird die Groß- und Kleinschreibung ignoriert.
Ein weitere Punkt sind Probleme mit Sonderzeichen. Umlaute sollten vermieden werden, da diese, bedingt durch vorhandene Kodierungen, zu fehlern führen.

Ich hoffe, das hilft dem einen oder anderen weiter.

Gruß
Martin
Martin Köditz
it & synergy GmbH
haederli
Beiträge: 8
Registriert: Mi 10. Okt 2018, 13:20

Danke
werde es heute mal testen!


Philip
Antworten