2017-05-07 3 views
0

Ich habe die folgende SQL-Code:Schleife durch Spaltennamen mit CASE-Anweisungen

Declare @TestOne NVARCHAR(80) 
Set @TestOne = 'olg.FIRST_NAME' 


Select transaction_id,first_name, LAST_NAME, joint_first_name, 
joint_last_name, honoree_first_name, honoree_last_name, 

    CASE WHEN olg.FIRST_NAME LIKE '% and %' THEN '1' ELSE '0' END+ 
    CASE WHEN olg.FIRST_NAME LIKE '% & %' THEN '1' ELSE '0' END+ 
    CASE WHEN olg.FIRST_NAME LIKE '% '' %' THEN '1' ELSE '0' END+ 
    CASE WHEN olg.FIRST_NAME LIKE '% , %' THEN '1' ELSE '0' END+ 
    CASE WHEN olg.FIRST_NAME LIKE '%. %' THEN '1' ELSE '0' END+ 
    CASE WHEN olg.FIRST_NAME LIKE '%Inc%' THEN '1' ELSE '0' END+ 
    CASE WHEN olg.FIRST_NAME LIKE '%foundation%' THEN '1' ELSE '0' END+ 
    CASE WHEN olg.FIRST_NAME LIKE '%Trust%' THEN '1' ELSE '0' END 
    AS CKLName 
from [dbo].OnlineGivingDailyLoad as olg 

Was ich will, ist zu tun, um eine Variable zu verwenden, die den Namen der anderen 8 Spalten enthält, die ich für überprüfen möchten eines der Zeichen in der obigen CASE-Anweisung. Was ich nicht will, ist, die obige CASE-Anweisung acht (8) Mal mit dem Namen der anderen Spalten zu wiederholen, die auf diese 'Strings' überprüft werden müssen. Gibt es einen Weg wie in C++, wo Sie einen Zähler haben Die Schleife durchläuft x mal und ändert gleichzeitig ein Array von Strings (die Spaltennamen), um nach den Substrings in der obigen case-Anweisung zu suchen. Die obige Variable führt nicht zu Ergebnissen, wenn sie anstelle des Spaltennamens verwendet wird.

Antwort

0

Wenn Sie diese mit auf separaten Zeile statt in separaten Spalten stehen können, können Sie verwenden apply:

select colname, 
     (CASE WHEN col LIKE '% and %' THEN '1' ELSE '0' END + 
     CASE WHEN col LIKE '% & %' THEN '1' ELSE '0' END + 
     CASE WHEN col LIKE '% '' %' THEN '1' ELSE '0' END + 
     CASE WHEN col LIKE '% , %' THEN '1' ELSE '0' END + 
     CASE WHEN col LIKE '%. %' THEN '1' ELSE '0' END + 
     CASE WHEN col LIKE '%Inc%' THEN '1' ELSE '0' END + 
     CASE WHEN col LIKE '%foundation%' THEN '1' ELSE '0' END + 
     CASE WHEN col LIKE '%Trust%' THEN '1' ELSE '0' END 
     ) as colcheck 
from [dbo].OnlineGivingDailyLoad olg cross apply 
    (values ('first_name', olg.first_name), 
      ('last_name', olg.last_name), 
      . . . 
    ) v(colname, col); 

Sie können pivot oder verwenden Sie bedingte Aggregation die Werte wieder auf eine Reihe zu bekommen, wenn es das ist, was du willst wirklich.