Sql 在case语句中搜索字符串以确定是否存在特定字符
我有以下SQL,包括Sql 在case语句中搜索字符串以确定是否存在特定字符,sql,sql-server-2014,Sql,Sql Server 2014,我有以下SQL,包括D.tinu类型的CASE语句。我想修改CASE语句(或使用另一个选项)以添加到第二个WHEN条件,以便当D.TIN_TYPE='S'和在D.paye_NAME1字符串中有一个逗号(,),然后使用LEFT/CHARINDEX,RIGHT/CHARINDEX函数将名称分成两列,否则只需按原样显示字符串(如果字符串中不包含逗号)。列的格式不一致为Lastname、Firstname(有些是Firstname-Lastname),因此我需要检查字符串中是否存在逗号。我如何才能做到这
D.tinu类型
的CASE
语句。我想修改CASE
语句(或使用另一个选项)以添加到第二个WHEN条件,以便当D.TIN_TYPE='S'和在D.paye_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。它运行,但对于姓氏列(右函数),它同时返回名字和姓氏。我如何才能只返回姓氏(逗号前的字符)?此外,我还尝试在每个列中使用END作为“First Name”和END作为“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
选择D.PAYER_TIN,'001',13679089,年份((转换(CHAR(10),A.PYMNT_DT,121)),D.PAYER_TIN,
D.TIN_类型='F'然后是'001'时的情况
当D.TIN_TYPE='S'时,则为'002'
以“纳税人识别类型”结尾,
A.供应商ID,
D.TIN_类型='F'然后离开时的情况(D.Paye_名称1,30)
当D.TIN_TYPE='S'和CHARINDEX(',',,D.PAYEE_NAME1)>0时,则左(D.PAYEE_NAME1,CHARINDEX(',',,D.PAYEE_NAME1)-1)--以“名字”结尾
当D.TIN_TYPE='S'和CHARINDEX(',','D.PAYEE_NAME1)>0时,右(D.PAYEE_NAME1,LEN(PAYEE_cityszip)-CHARINDEX(',','D.PAYEE_NAME1)+1--以“姓氏”结尾
其他D.收款人姓名1
以“收款人名称1”结尾,
D.收款人姓名1,
D.收款人姓名2,
D.收款人地址1,
左(收款人城市邮政编码,CHARINDEX(',',收款人城市邮政编码)-1),
子字符串(收款人城市邮政编码,CHARINDEX(',',收款人城市邮政编码)+2,2),
右(收款人城市邮政编码,LEN(收款人城市邮政编码)-CHARINDEX(“,”,收款人城市邮政编码)-7),
"我们",,
D.WTHD_箱1,
D.WTHD_箱2,
D.WTHD_箱3,
D.WTHD_箱6,
D.WTHD_箱7,
D.WTHD_箱14,
D.WTHD_箱16,
D.WTHD_箱18
来自PS_WTHD_TRXN_TBL A、PS_TMP_1099_COPYB D、PS_GHS_1099_PA_VW2 E
式中(A.WTHD_类型=D.WTHD_类型
A.VENDOR\u ID=D.VENDOR\u ID
年份(A.PYMNT_DT)=‘2018’
在('01'、'02'、'07'中的A.WTHD_类)
A.VENDOR\u ID=E.VENDOR\u ID
和A.VNDR_LOC=E.VNDR_LOC
E.YEAR='2018'
和D.WTHD_CNTL_ID='TGC'
和D.WTHD_BOX18>0.00
和A.供应商(ID“80577A”)
按D.PAYER\u TIN分组,年份((转换(CHAR(10),A.PYMNT\u DT,121)),D.Payeer\u TIN,当D.TIN\u类型为'F'然后为'001'时的情况
当D.TIN_TYPE='S'时,则为'002'
结束,A.供应商ID,D.收款人姓名1,D.收款人姓名2,D.收款人地址1,
左(收款人城市邮政编码,CHARINDEX(',',收款人城市邮政编码)-1),
子字符串(收款人城市邮政编码,CHARINDEX(',',收款人城市邮政编码)+2,2),
右(收款人城市邮政编码,LEN(收款人城市邮政编码)-CHARINDEX(“,”,收款人城市邮政编码)-7),
D.WTHD_盒1、D.WTHD_盒2、D.WTHD_盒3、D.WTHD_盒6、D.WTHD_盒7、D.WTHD_盒14、D.WTHD_盒16、D.WTHD_盒18
,D.TIN_TYPE='F'然后离开时的情况(D.paye_name 1,30)
其他D.收款人姓名1
完,,
D.TIN_类型='F'然后离开时的情况(D.Paye_名称1,30)
当D.TIN_TYPE='S'和CHARINDEX(',',,D.PAYEE_NAME1)>0时,则左(D.PAYEE_NAME1,CHARINDEX(',',,D.PAYEE_NAME1)-1)--以“名字”结尾
当D.TIN_TYPE='S'和CHARINDEX(',','D.PAYEE_NAME1)>0时,右(D.PAYEE_NAME1,LEN(PAYEE_cityszip)-CHARINDEX(',','D.PAYEE_NAME1)+1--以“姓氏”结尾
其他D.收款人姓名1
结束
您需要为此创建多个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
看
编辑:
请尝试从已编辑的查询中提取这个较短的查询。让它正常工作,然后开始在GROUP BY中添加其余条件,我认为这就是您的问题所在
看看我对收款人全名、收款人名、收款人姓做了什么
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' )
选择D.PAYER_TIN,'001',13679089,年份((转换(CHAR(10),A.PYMNT_DT,121)),D.PAYER_TIN,
D.TIN_类型='F'然后是'001'时的情况
当D.TIN_TYPE='S'时,则为'002'
以“纳税人识别类型”结尾,
A.供应商ID,
收款人全名=案例
当D.TIN_TYPE='F'然后离开时(D.Paye_name 1,30)
其他D.收款人姓名1
完,,
收款人姓名=案例
当D.TIN_TYPE='S'和CHARINDEX(',',,D.PAYEE_NAME1)>0时,则左(D.PAYEE_NAME1,CHARINDEX(',',,D.PAYEE_NAME1)-1)--以“名字”结尾
完,,
收款人姓氏=案例
当D.TIN_TYPE='S'和CHARINDEX(',','D.PAYEE_NAME1)>0时,右(D.PAYEE_NAME1,LEN(PAYEE_cityszip)-CHARINDEX(',','D.PAYEE_NAME1)+1--以“姓氏”结尾
结束
来自PS_WTHD_TRXN_TBL A、PS_TMP_1099_COPYB D、PS_GHS_1099_PA_VW2 E
式中(A.WTHD_类型=D.WTHD_类型
A.VENDOR\u ID=D.VENDOR\u ID
年份(A.PYMNT_DT)=‘2018’
在('01'、'02'、'07'中的A.WTHD_类)
A.VENDOR\u ID=E.VENDOR\u ID
和A.VNDR_LOC=E.VNDR_LOC
E.YEAR='2018'
和D.WTHD_CNTL_ID='TGC'
和D.WTHD_BOX18>0.00
和A.供应商(ID“80577A”)
我不确定CASE
是否可以返回两列,因此如果有更好的函数支持在满足上述条件(TIN_TYPE='s'且字符串中有逗号)时输出到两列(使用逗号作为分隔符)是真的谢谢Jon。我根据你的建议编辑了上面的帖子,但是我仍然在第二列(姓氏)中得到了名字子串…我还想知道我是否可以为每一列取一个不同的名字?@Nick你需要按照我提供的例子,每个名字部分一个案例陈述。当条件满足时,你不能有3个