none
Abfrage nach Teil eines Feldes RRS feed

  • Frage

  • Guten Tag,

    ich habe in einem Feld "Typen" vom Typ (nvarchar(MAX)) Texte gespeichert. Nun möchte ich nach Datensätzen suchen, in welchen in dem Feld bestimmte Wörter vorkommen.

    Ich hatte es so probiert:

    Select * from objekttypen where typen=N'*Haus'

    Funktioniert aber nicht. Ich suche dabei die Felder, welche das Wort "Haus" besitzen neben anderen, z.B. steht in dem einem Feld: "Dach, Haus, Fenster". Dieser Datensatz sollte dann gefunden werden.

    Ich hoffe, ich habe mich verständlich ausgedrückt und würde mich freuen, wenn ich Hilfe bekomme.

    Schönen Feiertag noch

    Claudia

    Dienstag, 1. Mai 2012 16:09

Antworten

  • Hallo Claudia,

    SELECT * 
    FROM objekttypen 
    WHERE typen LIKE '%Haus%'

    Schöne Grüsse.
    Dienstag, 1. Mai 2012 18:55
  • Hallo Claudia,

    wenn das wirklich eine als Freitext umgesetzte Werteliste sein soll, wäre es sinnvoller, dein Datenbankmodell anzupassen.

    [Typen]
    ID (int, PK, IDENTITY)
    Name (nvarchar( 100 ))

    [Objekte]
    ID (int, PK, IDENTITY)
    Name (nvarchar( 100 ))
    ...

    [Objekttypen]
    TypID (int, UK mit ObjektID), (FK von Typen.ID)
    ObjektID (int, UK mit TypID), (FK von Objekte.ID)

    Dann kannst Du entweder gleich über die ID Werte suchen oder dir eine View bauen, die die Typnamen mit ausliest und dann mit festen Werten suchen.

    LIKE '%...%' ist in der Regel ziemlich unperformant, das könntest Du über die o.g. Struktur erheblich effizienter lösen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 1. Mai 2012 19:06
    Moderator
  • Hallo Claudia

    Claudia Salzwedel wrote:

    Select * from objekttypen where typen=N'*Haus'

    Funktioniert aber nicht. Ich suche dabei die Felder, welche das Wort
    "Haus" besitzen neben anderen, z.B. steht in dem einem Feld: "Dach, Haus,
    Fenster". Dieser Datensatz sollte dann gefunden werden.

    Über die fehlende Normalisierung und Verbesserung, das in eine eigene Tabelle zu legen, hat ja Stephan bereits geschrieben. Ebenfalls die Bedenken bezüglich LIKE '%....%'

    Frage: Soll, wenn Du nach *Haus suchst auch etwas kommen, was in der Liste z.B. "Gertenhaus, Fenster, Dach" drin hat? Oder nur das, was wirklich Haus drin hat? Falls zweiteres, dann musst Du den Vorschlag von Joerg_x noch erweitern. Annahme als Trennzeichen wurde immer , und ein Leerzeichen benutzt ' '. Dann würde das Statement so aussehen:

    SELECT *
    FROM objekttypen
    WHERE ' ' + typen + "," LIKE '% Haus,%'

    Gruss
    Henry

    Mittwoch, 2. Mai 2012 02:58

Alle Antworten

  • Hallo Claudia,

    SELECT * 
    FROM objekttypen 
    WHERE typen LIKE '%Haus%'

    Schöne Grüsse.
    Dienstag, 1. Mai 2012 18:55
  • Hallo Claudia,

    wenn das wirklich eine als Freitext umgesetzte Werteliste sein soll, wäre es sinnvoller, dein Datenbankmodell anzupassen.

    [Typen]
    ID (int, PK, IDENTITY)
    Name (nvarchar( 100 ))

    [Objekte]
    ID (int, PK, IDENTITY)
    Name (nvarchar( 100 ))
    ...

    [Objekttypen]
    TypID (int, UK mit ObjektID), (FK von Typen.ID)
    ObjektID (int, UK mit TypID), (FK von Objekte.ID)

    Dann kannst Du entweder gleich über die ID Werte suchen oder dir eine View bauen, die die Typnamen mit ausliest und dann mit festen Werten suchen.

    LIKE '%...%' ist in der Regel ziemlich unperformant, das könntest Du über die o.g. Struktur erheblich effizienter lösen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 1. Mai 2012 19:06
    Moderator
  • Hallo Claudia

    Claudia Salzwedel wrote:

    Select * from objekttypen where typen=N'*Haus'

    Funktioniert aber nicht. Ich suche dabei die Felder, welche das Wort
    "Haus" besitzen neben anderen, z.B. steht in dem einem Feld: "Dach, Haus,
    Fenster". Dieser Datensatz sollte dann gefunden werden.

    Über die fehlende Normalisierung und Verbesserung, das in eine eigene Tabelle zu legen, hat ja Stephan bereits geschrieben. Ebenfalls die Bedenken bezüglich LIKE '%....%'

    Frage: Soll, wenn Du nach *Haus suchst auch etwas kommen, was in der Liste z.B. "Gertenhaus, Fenster, Dach" drin hat? Oder nur das, was wirklich Haus drin hat? Falls zweiteres, dann musst Du den Vorschlag von Joerg_x noch erweitern. Annahme als Trennzeichen wurde immer , und ein Leerzeichen benutzt ' '. Dann würde das Statement so aussehen:

    SELECT *
    FROM objekttypen
    WHERE ' ' + typen + "," LIKE '% Haus,%'

    Gruss
    Henry

    Mittwoch, 2. Mai 2012 02:58
  • Hallo Claudia Salzwedel,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 10. Mai 2012 13:23
    Moderator