2016-05-27 2 views
1

次のコードに示すように2つのテーブル(#temp1#temp2)がありますが、#temp2テーブルにある値に一致する静的IDを取得しようとしていますが、nullを返すような問題があります。staticID value 。SQL Server 2012のreplace、substring charindexを使用してテーブルからIDを取得する方法は?

私は以下のコードで私がやっている間違ったことを誰かに教えてもらえませんか?

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

に失敗しました:これを試してみてください。 Temp2テーブルは、Temp1のような別々のフィールドに分割する必要があります。 – Chuck

+0

あなたの参加条件では、そこに一致するものは見つかりません。全てを大文字にしないと、あなたは大きな好意を持ちます。それは読むのがとても難しいです。そして、実際には、このように複数の値を1つの列に入れるべきではありません。一緒に働くのは本当の痛みです。 –

+0

これは、コード内で動作していない部分の単なる例です...問題は#temp2の値に名前(いくつかの番号)があります。番号の部分を削除し、一致する名前のIDを取得する必要があります....上記の問題には解決策がありますか? –

答えて

1

#temp1テーブルのSTATISTICNAME

Per capita disappearance, carcass weight 
Production 

#tempデータが来るので、明らかに、左テーブルをLEFT JOINを使用しているので#temp2テーブルのSTATISTICNAME

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

とのマッチング、そうSTATICIDされていませんからの列#temp1が返されますNULL

この列で部分検索を実行する場合は、LIKE演算子を使用します。だからあなたのLEFT JOINブロックは次のようになります。

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

あなたはあなたが解析された値に参加されていない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

に一致する列を変更する必要があります。

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

ないあなたが探しているものを確認してください、しかし、あなたの参加は、あなたがこのためにメモリテーブルに使用されなければならない

Select A.*,B.* 
From #Temp1 A 
Join #Temp2 B on (B.STATICNAME Like A.STATISTICNAME+'%' ) 
関連する問題