在 case 语句中搜索字符串以查找特定字符的存在
Search string inside case statement for existence of specific character
我有以下 SQL,包括 D.TIN_TYPE
的 CASE
语句。我想修改 CASE
语句(或使用替代方法)以添加到第二个 WHEN 条件,以便 WHEN D.TIN_TYPE = 'S' AND
在 D.PAYEE_NAME1
字符串中有一个逗号 (,) 然后断开名称使用 LEFT/CHARINDEX, RIGHT/CHARINDEX 函数分成两列,否则只按原样显示字符串(如果字符串中不包含逗号)。该列的格式不一致 Lastname, Firstname(有些是 Firstname Lastname),所以这就是我需要检查逗号是否存在的原因在字符串中。我怎样才能做到这一点?
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
编辑:
这里是经过编辑的 SQL,在 CASE 语句中使用了一个额外的 WHEN。它运行,但对于姓氏列(RIGHT 函数)它是 return 名字和姓氏。我怎样才能 return 姓氏(逗号前的字符)?我还尝试对每个 WHEN 使用 END AS 'First Name' 和 END AS 'Last Name' 但出现语法错误。有没有办法为列指定不同的名称?
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
您需要为此创建多个 case 语句。我的建议是创建 3 个 case 语句:一个用于非拆分,一个用于第一次拆分,一个用于第二次拆分。
要检查逗号,您可以使用如下方式:
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
见CASE (Transact-SQL) Example B
编辑:
尝试从您编辑的查询中提取的这个较短的查询。让它工作,然后开始在 GROUP BY 中添加其余的条件,我认为这就是你的问题所在。
看看我用 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' )
我有以下 SQL,包括 D.TIN_TYPE
的 CASE
语句。我想修改 CASE
语句(或使用替代方法)以添加到第二个 WHEN 条件,以便 WHEN D.TIN_TYPE = 'S' AND
在 D.PAYEE_NAME1
字符串中有一个逗号 (,) 然后断开名称使用 LEFT/CHARINDEX, RIGHT/CHARINDEX 函数分成两列,否则只按原样显示字符串(如果字符串中不包含逗号)。该列的格式不一致 Lastname, Firstname(有些是 Firstname Lastname),所以这就是我需要检查逗号是否存在的原因在字符串中。我怎样才能做到这一点?
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
编辑:
这里是经过编辑的 SQL,在 CASE 语句中使用了一个额外的 WHEN。它运行,但对于姓氏列(RIGHT 函数)它是 return 名字和姓氏。我怎样才能 return 姓氏(逗号前的字符)?我还尝试对每个 WHEN 使用 END AS 'First Name' 和 END AS 'Last Name' 但出现语法错误。有没有办法为列指定不同的名称?
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
您需要为此创建多个 case 语句。我的建议是创建 3 个 case 语句:一个用于非拆分,一个用于第一次拆分,一个用于第二次拆分。
要检查逗号,您可以使用如下方式:
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
见CASE (Transact-SQL) Example B
编辑: 尝试从您编辑的查询中提取的这个较短的查询。让它工作,然后开始在 GROUP BY 中添加其余的条件,我认为这就是你的问题所在。
看看我用 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' )