2017-01-06 2 views
2

Ich würde gerne wissen, ob das Finden einer Zeichenfolge aus einer anderen Tabelle erfolgen kann. Es ist ein bisschen kompliziert.SQL Find String

Hier ist die Tabelle: (tbl_dishes)

| dish    | Type  | 
| egg, hotdog & bread | Breakfast | 

Aus der obigen Tabelle, möchte ich aus einer anderen Tabelle

zweiten Tabelle (tbl_Foods) die einzelnen Beschreibungen der Spalte Gericht bekommen

| food | Description | 
| egg | Fresh  | 
| hotdog | red   | 
| bread | toasted  | 
| steak | meat  | 

Nehmen wir an, meine Abfrage würde so aussehen: (aber es ist falsch)

SELECT food, description FROM tbl_Foods 
    WHERE food Exists IN (SELECT dish FROM tbl_Dishes) 

würde meine gewünschten Ergebnisse sein:

| food | Description | 
    | egg | Fresh  | 
    | hotdog | red   | 
    | bread | toasted  | 

Es ist wie alle abgestimmt Wort in der Spalte Gericht bekommen. Ich weiß nicht, ob es möglich ist. Bitte helfen Sie.

Vielen Dank.

+0

woher kommt * Description *? – Stephen

+0

kam es von den tbl_Foods. – SyntaxError

+0

dann können Sie die Struktur von 'tbl_Foods' hinzufügen bitte – Stephen

Antwort

3
SELECT food, description 
FROM tbl_Foods 
join tbl_Dishes 
on tbl_Dishes.dish like ('%' + tbl_Foods.food +'%') 
+0

Nicht das Verwenden von '+' für die Verkettung von Strings ist Nicht-Standard-SQL (und die Frage ist nur mit 'sql' markiert, kein spezifisches DBMS-Produkt) –

0

Sie müssen die Liste

DECLARE @DelimString VARCHAR(100) 
SET DelimString = SELECT REPLACE(REPLACE(dish,'&',','),' ', '') FROM tbl_Dishes 

DECLARE @Dish TABLE (Dish VARCHAR(50)); INSERT INTO @Dish SELECT CAST(ParamValue AS VARCHAR) FROM MultiValueParams_String(@DelimString) 

Mit dieser Funktion können aufzuspalten.

Create function [dbo].[MultiValueParams_String] (@ParamList varchar(4000)) 
returns @Values table (RoNum INT,ParamValue varchar(4000)) 
as 
begin 
declare @Delim char(1) = ',' -- comma is always the delimiter 
declare @Chrind int = 1 
declare @Piece nvarchar(50) 
declare @RoNum int = 0 
while @Chrind>0 
    begin 
     select @Chrind=charindex(@Delim,@ParamList) 
     if @Chrind>0 
      select @Piece=left(@ParamList,@chrind-1) 
     else 
      select @[email protected] 
     insert @values(RoNum,ParamValue) values (@RoNum,@Piece) 
     select @ParamList = right(@ParamList,len(@ParamList)[email protected]) 
     if len(@ParamList)=0 break 
     SELECT @RoNum = @RoNum + 1 
    end 
return 
end 

SELECT food, description 
FROM tbl_Foods f 
INNER JOIN @Dish d ON f.food = d.dish 

So etwas wie das.

+0

Diese Art von Splitter ist das absolut schlechteste. Aus Sicht der Performance ist es so schlecht, dass es nicht einmal die Liste der Splitter zum Vergleich zwischen den Leuten erstellt, die die verschiedenen Typen erstellt und analysiert haben. Hier ist ein Link zu einem viel besseren Splitter als diese Loop-basierte Version. http://sqlperformance.com/2012/07/t-sql-queries/split-strings Hinzufügen der Leistung Herausforderungen hier ist die Multi-Anweisung Tabellenwert-Funktion. Diese sind fast immer langsamer als Skalarfunktionen. Und natürlich das Looping ... –

+0

@SeanLange danke für den Link. Ich werde meine DBs jetzt aktualisieren, nachdem ich das gesehen habe. – Snowlockk

+0

Ehrfürchtig. Froh, dass ich etwas Wissen für Verbesserungen teilen könnte. : D –

Verwandte Themen