2016-05-27 5 views
1

Ich habe zwei Tabellen (#temp1 und #temp2), wie im folgenden Code gezeigt und ich versuche, die passende statische ID für die Werte in #temp2 Tisch zu bekommen, aber es gibt Probleme mit dem folgenden Code, so dass es null staticID Wert zurückzugibt .Wie erhalte ich eine ID aus der Tabelle mit Ersetzen, Teilzeichenfolge charindex in SQL Server 2012?

Ich bin mir nicht sicher, wo es falsch ist, kann jemand mich wissen lassen, was der Fehler ist, den ich in dem unten stehenden Code mache?

BEGIN 
    CREATE TABLE #temp2 
     (
     staticname VARCHAR(160), 
    ) 

    INSERT INTO #temp2 
    VALUES  ('Per capita disappearance, carcass weight(456)'), 
       ('Production(286)') 

    CREATE TABLE #temp1 
     (
     idnum   INTEGER IDENTITY(1, 1), 
     statisticname VARCHAR(256), 
     staticid  INTEGER 
    ) 

    INSERT INTO #temp1 
    VALUES  ('Per capita disappearance, carcass weight', 
       '144'), 
       ('Production', 
       '143') 

SELECT 
    Ltrim (Rtrim (Replace (T2.staticname, Substring(T2.staticname, 
        Charindex('(', T2.staticname, 0), 
        Len(T2.staticname) - (Charindex('(', T2.staticname, 0) - 1)), '' 
     ))), 
    T1.staticid 
FROM 
    #temp2 T2 
LEFT JOIN 
    #temp1 T1 ON T2.staticname = T1.statisticname 

DROP TABLE #temp1 
DROP TABLE #temp2 
+0

Sie sollten diese in Speichertabellen werden. Temp2-Tabelle sollte als separate Felder wie Temp1 aufgeteilt werden. – Chuck

+0

Ihre Beitrittskriterien werden dort keine Übereinstimmung finden. Du würdest dir selbst einen großen Gefallen tun, indem du nicht alles in Großbuchstaben machst. Es ist so schwer zu lesen. Und Sie sollten wirklich nicht mehrere Werte in eine einzelne Spalte setzen. Es ist ein echter Schmerz, mit ihm zu arbeiten. –

+0

Dies ist nur ein Beispiel für einen Teil im Code, wo es nicht funktioniert ... Problem ist die # temp2 Werte hat Name (einige Zahl) drin. Ich muss den Zahlenteil entfernen und holen Sie die ID für die passenden Namen .... Hat das obige Problem eine Lösung? –

Antwort

1

#temp1 Tisch STATISTICNAME Werte

Per capita disappearance, carcass weight 
Production 

passen nicht mit #temp2STATISTICNAME Werte der Tabelle

Per capita disappearance, carcass weight(456) 
Production(286) 

Da die LEFT JOIN so offensichtlich die linke Tabelle mit #temp Daten kommen, so die STATICID Spalte aus #temp1 wird zurückgegeben NULL

Wenn Sie die partielle Suche mit den Spalten durchführen möchten, verwenden Sie den Operator LIKE. Also Ihr LEFT JOIN Block wird sein:

LEFT JOIN #TEMP1 T1 ON T2.STATICNAME LIKE T1.STATISTICNAME + '%' 
1

Sie haben die Spalten zu ändern, die in dem Match JOIN

SELECT LTRIM (RTRIM (REPLACE (T2.STATICNAME,SUBSTRING(T2.STATICNAME, CHARINDEX('(',T2.STATICNAME,0), LEN(T2.STATICNAME)-(CHARINDEX('(',T2.STATICNAME,0)-1)), ''))) 
     ,T1.STATICID 
FROM #TEMP2 T2 LEFT JOIN #TEMP1 T1 ON LTRIM (RTRIM (REPLACE (T2.STATICNAME,SUBSTRING(T2.STATICNAME, CHARINDEX('(',T2.STATICNAME,0), LEN(T2.STATICNAME)-(CHARINDEX('(',T2.STATICNAME,0)-1)), ''))) 
             = T1.STATISTICNAME 
1

Sie sind nicht auf dem analysierten Wert verbinden. Versuchen Sie folgendes:

BEGIN 

CREATE TABLE #TEMP2 
(
    STATICNAME Varchar(160), 
) 

INSERT INTO #TEMP2 VALUES ('Per capita disappearance, carcass weight(456)'),('Production(286)') 
    CREATE TABLE #TEMP1 
(
IDNUM INTEGER IDENTITY(1,1), 
STATISTICNAME VARCHAR(256), 
STATICID INTEGER 
) 

INSERT INTO #TEMP1 VALUES ('Per capita disappearance, carcass weight','144'),('Production','143') 

;With cteParsed As 
(Select *, 
    LTRIM (RTRIM (REPLACE (T2.STATICNAME,SUBSTRING(T2.STATICNAME, 
    CHARINDEX('(',T2.STATICNAME,0), LEN(T2.STATICNAME)- 
    (CHARINDEX('(',T2.STATICNAME,0)-1)), ''))) StaticNameParsed 
    From #Temp2 T2 
) 
Select *, T1.STATICID 
    From cteParsed T2 
    LEFT JOIN #TEMP1 T1 ON T2.StaticNameParsed = T1.STATISTICNAME 
DROP TABLE #TEMP1 
DROP TABLE #TEMP2 
END 
1

nicht sicher, was Sie suchen, aber Ihre join versagte

Select A.*,B.* 
From #Temp1 A 
Join #Temp2 B on (B.STATICNAME Like A.STATISTICNAME+'%' ) 
Verwandte Themen