简体   繁体   English

在case语句中搜索字符串是否存在特定字符

[英]Search string inside case statement for existence of specific character

I have the following SQL, including a CASE statement for D.TIN_TYPE . 我有以下SQL,包括D.TIN_TYPECASE语句。 I want to modify the CASE statement (or use an alternative) to add onto the 2nd WHEN condition so that WHEN D.TIN_TYPE = 'S' AND there is a comma (,) within the D.PAYEE_NAME1 string then break the name into two columns using LEFT/CHARINDEX, RIGHT/CHARINDEX function, Otherwise just display the string as-is (if there is not a comma contained in the string). 我想修改CASE语句(或使用替代方法)以添加到第二个WHEN条件,以便WHEN D.TIN_TYPE = 'S' AND并且D.PAYEE_NAME1字符串内有一个逗号(,),然后将该名称分成两个列使用LEFT / CHARINDEX,RIGHT / CHARINDEX函数,否则仅按原样显示字符串(如果字符串中不包含逗号)。 The column is not consistently formatted as Lastname, Firstname (some are Firstname Lastname ) so that is why I need to check for the existence of the comma in the string. 该列的格式不统一为Lastname,Firstname (有些是Firstname Lastname ),因此这就是为什么我需要检查字符串中是否存在逗号的原因。 How can I accomplish this? 我该怎么做?

    SELECT D.PAYER_TIN, '001', YEAR( (CONVERT(CHAR(10),A.PYMNT_DT,121))), D.PAYEE_TIN, 
    CASE WHEN  D.TIN_TYPE = 'F' THEN '001' 
         WHEN  D.TIN_TYPE = 'S' THEN '002' 
         END AS 'Taxpayer Identification Type', 
    A.VENDOR_ID,
    CASE WHEN D.TIN_TYPE = 'F' THEN LEFT(D.PAYEE_NAME1, 30)
         WHEN D.TIN_TYPE = 'S' AND --Additional logic for existence of comma--
         ELSE D.PAYEE_NAME1
         END AS 'PAYEE_NAME1', 
    D.PAYEE_NAME1,
    D.PAYEE_NAME2,  
    D.PAYEE_ADDRESS1, 
    LEFT(PAYEE_CITYSTZIP,CHARINDEX(',', PAYEE_CITYSTZIP)-1), 
    SUBSTRING(PAYEE_CITYSTZIP, CHARINDEX(',', PAYEE_CITYSTZIP)+2, 2), 
    RIGHT(PAYEE_CITYSTZIP, LEN(PAYEE_CITYSTZIP) - CHARINDEX(',', PAYEE_CITYSTZIP)-7), 
    'US', 
    D.WTHD_BOX1, 
    D.WTHD_BOX2, 
    D.WTHD_BOX3, 
   FROM PS_WTHD_TRXN_TBL A, PS_TMP_1099_COPYB D, PS_GHS_1099_PA_VW2 E 
   WHERE ( A.WTHD_TYPE = D.WTHD_TYPE 
         AND A.VENDOR_ID = D.VENDOR_ID 
         AND YEAR( A.PYMNT_DT) = '2018')
   GROUP BY  D.PAYER_TIN,  YEAR( (CONVERT(CHAR(10),A.PYMNT_DT,121))),  D.PAYEE_TIN,  CASE WHEN  D.TIN_TYPE = 'F' THEN '001' 
    WHEN  D.TIN_TYPE = 'S' THEN '002' 
    END,  A.VENDOR_ID,  D.PAYEE_NAME1,  D.PAYEE_NAME2,   D.PAYEE_ADDRESS1, 
    LEFT(PAYEE_CITYSTZIP,CHARINDEX(',', PAYEE_CITYSTZIP)-1),  
    SUBSTRING(PAYEE_CITYSTZIP, CHARINDEX(',', PAYEE_CITYSTZIP)+2, 2),  
    RIGHT(PAYEE_CITYSTZIP, LEN(PAYEE_CITYSTZIP) - CHARINDEX(',', PAYEE_CITYSTZIP)-7), 
    D.WTHD_BOX1,  D.WTHD_BOX2,  D.WTHD_BOX3,  D.WTHD_BOX6,  D.WTHD_BOX7,  D.WTHD_BOX14,  D.WTHD_BOX16,  D.WTHD_BOX18
    , CASE WHEN D.TIN_TYPE = 'F' THEN LEFT(D.PAYEE_NAME1, 30)
         ELSE D.PAYEE_NAME1
         END

EDIT: 编辑:

Here is the edited SQL, using an extra WHEN in the CASE statement. 这是经过编辑的SQL,在CASE语句中使用了额外的WHEN。 It runs but for the last name column (RIGHT function) it's returning both the first and last name. 它运行,但是对于姓氏列(RIGHT函数),它同时返回名字和姓氏。 How can I just return the last name (characters before the comma)? 我如何才能返回姓氏(逗号前的字符)? Also I tried using END AS 'First Name' and END AS 'Last Name' for each WHEN but I got a syntax error. 我也尝试为每个WHEN使用END AS'First name'和END AS'Last Name',但是出现语法错误。 Is there a way to give the columns distinct names? 有没有一种方法可以为列指定不同的名称?

SELECT D.PAYER_TIN, '001', 13679089, YEAR( (CONVERT(CHAR(10),A.PYMNT_DT,121))), D.PAYEE_TIN, 
CASE WHEN  D.TIN_TYPE = 'F' THEN '001' 
     WHEN  D.TIN_TYPE = 'S' THEN '002' 
     END AS 'Taxpayer Identification Type', 
A.VENDOR_ID,
CASE WHEN D.TIN_TYPE = 'F' THEN LEFT(D.PAYEE_NAME1, 30)
     WHEN D.TIN_TYPE = 'S' AND CHARINDEX(',',D.PAYEE_NAME1) > 0 THEN LEFT(D.PAYEE_NAME1,CHARINDEX(',', D.PAYEE_NAME1)-1)  --END AS 'First Name'
     WHEN D.TIN_TYPE = 'S' AND CHARINDEX(',',D.PAYEE_NAME1) > 0 THEN RIGHT(D.PAYEE_NAME1, LEN(PAYEE_CITYSTZIP) - CHARINDEX(',', D.PAYEE_NAME1)+1 ) --END AS 'Last Name'
     ELSE D.PAYEE_NAME1
     END AS 'PAYEE_NAME1', 
D.PAYEE_NAME1,
D.PAYEE_NAME2,  
D.PAYEE_ADDRESS1, 
LEFT(PAYEE_CITYSTZIP,CHARINDEX(',', PAYEE_CITYSTZIP)-1), 
SUBSTRING(PAYEE_CITYSTZIP, CHARINDEX(',', PAYEE_CITYSTZIP)+2, 2), 
RIGHT(PAYEE_CITYSTZIP, LEN(PAYEE_CITYSTZIP) - CHARINDEX(',', PAYEE_CITYSTZIP)-7), 
'US', 
D.WTHD_BOX1, 
D.WTHD_BOX2, 
D.WTHD_BOX3, 
D.WTHD_BOX6, 
D.WTHD_BOX7, 
D.WTHD_BOX14, 
D.WTHD_BOX16, 
D.WTHD_BOX18 
FROM PS_WTHD_TRXN_TBL A, PS_TMP_1099_COPYB D, PS_GHS_1099_PA_VW2 E 
WHERE ( A.WTHD_TYPE = D.WTHD_TYPE 
     AND A.VENDOR_ID = D.VENDOR_ID 
     AND YEAR( A.PYMNT_DT) = '2018'
     AND A.WTHD_CLASS IN ('01','02','07') 
     AND A.VENDOR_ID = E.VENDOR_ID 
     AND A.VNDR_LOC = E.VNDR_LOC 
     AND E.YEAR = '2018' 
     AND D.WTHD_CNTL_ID = 'TGC' 
     AND D.WTHD_BOX18 > 0.00
     AND A.VENDOR_ID <> '80577A' ) 
GROUP BY  D.PAYER_TIN,  YEAR( (CONVERT(CHAR(10),A.PYMNT_DT,121))),  D.PAYEE_TIN,  CASE WHEN  D.TIN_TYPE = 'F' THEN '001' 
WHEN  D.TIN_TYPE = 'S' THEN '002' 
END,  A.VENDOR_ID,  D.PAYEE_NAME1,  D.PAYEE_NAME2,   D.PAYEE_ADDRESS1, 
LEFT(PAYEE_CITYSTZIP,CHARINDEX(',', PAYEE_CITYSTZIP)-1),  
SUBSTRING(PAYEE_CITYSTZIP, CHARINDEX(',', PAYEE_CITYSTZIP)+2, 2),  
RIGHT(PAYEE_CITYSTZIP, LEN(PAYEE_CITYSTZIP) - CHARINDEX(',', PAYEE_CITYSTZIP)-7), 
D.WTHD_BOX1,  D.WTHD_BOX2,  D.WTHD_BOX3,  D.WTHD_BOX6,  D.WTHD_BOX7,  D.WTHD_BOX14,  D.WTHD_BOX16,  D.WTHD_BOX18
, CASE WHEN D.TIN_TYPE = 'F' THEN LEFT(D.PAYEE_NAME1, 30)
     ELSE D.PAYEE_NAME1
     END, 
       CASE WHEN D.TIN_TYPE = 'F' THEN LEFT(D.PAYEE_NAME1, 30)
       WHEN D.TIN_TYPE = 'S' AND CHARINDEX(',',D.PAYEE_NAME1) > 0 THEN LEFT(D.PAYEE_NAME1,CHARINDEX(',', D.PAYEE_NAME1)-1)  --END AS 'First Name'
       WHEN D.TIN_TYPE = 'S' AND CHARINDEX(',',D.PAYEE_NAME1) > 0 THEN RIGHT(D.PAYEE_NAME1, LEN(PAYEE_CITYSTZIP) - CHARINDEX(',', D.PAYEE_NAME1)+1 ) --END AS 'Last Name'
       ELSE D.PAYEE_NAME1
       END

You will need to create multiple case statements for this. 您将需要为此创建多个case语句。 My suggestion would be to create 3 case statements: one for the non-split, one for the first split and one for the second split. 我的建议是创建3个case语句:一个用于非拆分,一个用于第一个拆分,一个用于第二个拆分。

To check for the comma, you can use something like this: 要检查逗号,可以使用类似以下的内容:

select 
    split1=case
        WHEN CHARINDEX(',','a,b') > 0 AND D.TIN_TYPE = 'S' THEN left('a,b', CHARINDEX(',','a,b')-1)
    END,
    split2=case
        WHEN CHARINDEX(',','a,b') > 0 AND D.TIN_TYPE = 'S' THEN right('a,b', len('a,b')-CHARINDEX(',','a,b'))
    END  

Results:
split1  split2
a        b

See CASE (Transact-SQL) Example B 请参见CASE(Transact-SQL)示例B

EDIT: Try this shorter query taken from your edited one. 编辑:尝试从您编辑过的查询中提取此较短的查询。 Get this to work and then start adding on the rest of your conditionals in the GROUP BY, I think that is where your problem is. 使它起作用,然后开始在GROUP BY中添加其余条件,我认为这就是您的问题所在。

See what I did with PAYEE_FULLNAME, PAYEE_FIRSTNAME, PAYEE_LASTNAME. 查看我对PAYEE_FULLNAME,PAYEE_FIRSTNAME和PAYEE_LASTNAME所做的事情。

    SELECT D.PAYER_TIN, '001', 13679089, YEAR( (CONVERT(CHAR(10),A.PYMNT_DT,121))), D.PAYEE_TIN, 
CASE WHEN  D.TIN_TYPE = 'F' THEN '001' 
     WHEN  D.TIN_TYPE = 'S' THEN '002' 
     END AS 'Taxpayer Identification Type', 
A.VENDOR_ID,
PAYEE_FULLNAME=CASE 
        WHEN D.TIN_TYPE = 'F' THEN LEFT(D.PAYEE_NAME1, 30)
        ELSE D.PAYEE_NAME1
     END , 
PAYEE_FIRSTNAME=CASE 
        WHEN D.TIN_TYPE = 'S' AND CHARINDEX(',',D.PAYEE_NAME1) > 0 THEN LEFT(D.PAYEE_NAME1,CHARINDEX(',', D.PAYEE_NAME1)-1)  --END AS 'First Name'
       END ,
PAYEE_LASTNAME=CASE 
        WHEN D.TIN_TYPE = 'S' AND CHARINDEX(',',D.PAYEE_NAME1) > 0 THEN RIGHT(D.PAYEE_NAME1, LEN(PAYEE_CITYSTZIP) - CHARINDEX(',', D.PAYEE_NAME1)+1 ) --END AS 'Last Name'
     END
FROM PS_WTHD_TRXN_TBL A, PS_TMP_1099_COPYB D, PS_GHS_1099_PA_VW2 E 
WHERE ( A.WTHD_TYPE = D.WTHD_TYPE 
     AND A.VENDOR_ID = D.VENDOR_ID 
     AND YEAR( A.PYMNT_DT) = '2018'
     AND A.WTHD_CLASS IN ('01','02','07') 
     AND A.VENDOR_ID = E.VENDOR_ID 
     AND A.VNDR_LOC = E.VNDR_LOC 
     AND E.YEAR = '2018' 
     AND D.WTHD_CNTL_ID = 'TGC' 
     AND D.WTHD_BOX18 > 0.00
     AND A.VENDOR_ID <> '80577A' ) 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM