在SQL中使用交叉应用时查找两个表之间的匹配值
我试图从表A列x中提取5个或更多连续数字,并将提取的数字与表B列z相匹配。如果该值存在,则可以,但如果该值不存在,则需要将其插入表B中。我已设法从表A中提取数字,但在尝试加入时,我被卡住了,因为我使用了交叉应用和大小写。也许我只是不明白该怎么做 我用来提取数字的代码:在SQL中使用交叉应用时查找两个表之间的匹配值,sql,sql-server,join,case,patindex,Sql,Sql Server,Join,Case,Patindex,我试图从表A列x中提取5个或更多连续数字,并将提取的数字与表B列z相匹配。如果该值存在,则可以,但如果该值不存在,则需要将其插入表B中。我已设法从表A中提取数字,但在尝试加入时,我被卡住了,因为我使用了交叉应用和大小写。也许我只是不明白该怎么做 我用来提取数字的代码: SELECT nvt.AdditionalInformation, CASE WHEN M.FirstMatch > 0 THEN SUBSTRING(Additio
SELECT nvt.AdditionalInformation,
CASE
WHEN M.FirstMatch > 0
THEN SUBSTRING(AdditionalInformation, M.FirstMatch-1, N.SecondMatch-1)
--check IF TPNumber EXISTS in ChangeRequests table then add ChangeRequest Id to ReportVersionChangeRequests table
ELSE NULL
END
FROM
(
SELECT ':'+nvt.AdditionalInformation+':' AdditionalInformation
FROM dbo.NSReportVtest nvt
) nvt
CROSS APPLY(VALUES(PATINDEX('%[0-9][0-9][0-9][0-9][0-9]%', ':'+nvt.AdditionalInformation+':'))) M(FirstMatch)
CROSS APPLY(VALUES(PATINDEX('%[^0-9]%', SUBSTRING(AdditionalInformation, M.FirstMatch-1, LEN(AdditionalInformation))))) N(SecondMatch)
目前,这是代码的结果:
表A:
附加信息
没有列名
:测试结果:
无效的
:测试结果:
256985
:测试结果:
无效的
:测试结果:
无效的
:测试结果:
无效的
:测试结果:
85965
我找到了一个有效的解决方案。我插入到一个临时表中,然后我可以选择特定的列,并将其连接到第二个表中,这样可以更容易地管理数据
SELECT nv.AdditionalInformation,
nv.Id,
CASE
WHEN M.FirstMatch > 0
THEN SUBSTRING(AdditionalInformation, M.FirstMatch-1, N.SecondMatch-1)
ELSE NULL
END AS ExtractedTP
INTO #temp
FROM
(
SELECT ':'+nv.AdditionalInformation+':' AdditionalInformation,
nv.Id
FROM dbo.NSReportVtest nv
) nv
CROSS APPLY(VALUES(PATINDEX('%[0-9][0-9][0-9][0-9][0-9]%', ':'+nv.AdditionalInformation+':'))) M(FirstMatch)
CROSS APPLY(VALUES(PATINDEX('%[^0-9]%', SUBSTRING(AdditionalInformation, M.FirstMatch-1, LEN(AdditionalInformation))))) N(SecondMatch);
--select and join temp table to ChangeRequests table to see which TP Numbers exist
SELECT t.Id,
t.ExtractedTP,
nrt.TPNumber,
nrt.Id
FROM #temp t
LEFT JOIN dbo.NSChangeRequestsTest nrt ON t.ExtractedTP = nrt.TPNumber
ORDER BY t.ExtractedTP DESC;
我找到了一个有效的解决方案。我插入到一个临时表中,然后我可以选择特定的列,并将其连接到第二个表中,这样可以更容易地管理数据
SELECT nv.AdditionalInformation,
nv.Id,
CASE
WHEN M.FirstMatch > 0
THEN SUBSTRING(AdditionalInformation, M.FirstMatch-1, N.SecondMatch-1)
ELSE NULL
END AS ExtractedTP
INTO #temp
FROM
(
SELECT ':'+nv.AdditionalInformation+':' AdditionalInformation,
nv.Id
FROM dbo.NSReportVtest nv
) nv
CROSS APPLY(VALUES(PATINDEX('%[0-9][0-9][0-9][0-9][0-9]%', ':'+nv.AdditionalInformation+':'))) M(FirstMatch)
CROSS APPLY(VALUES(PATINDEX('%[^0-9]%', SUBSTRING(AdditionalInformation, M.FirstMatch-1, LEN(AdditionalInformation))))) N(SecondMatch);
--select and join temp table to ChangeRequests table to see which TP Numbers exist
SELECT t.Id,
t.ExtractedTP,
nrt.TPNumber,
nrt.Id
FROM #temp t
LEFT JOIN dbo.NSChangeRequestsTest nrt ON t.ExtractedTP = nrt.TPNumber
ORDER BY t.ExtractedTP DESC;
我迷路了。查询返回一个结果集。您想要多个结果集吗?是否要修改表b?是否要在新结果集中显示结果?身份证是如何计算的?抱歉有点混乱。我需要一个结果集。id列是自动生成的。我需要表A和表B基本上合并到表C中。提供的代码当前生成结果集表A。那么为什么ID会改变呢?为什么不直接使用b的ID呢?把SELECT放在第三个APPLY中,并将其放到一旁:否则NULL在某种情况下是不必要的,尽管它确实使它变得有点清晰。I’m lost。查询返回一个结果集。您想要多个结果集吗?是否要修改表b?是否要在新结果集中显示结果?身份证是如何计算的?抱歉有点混乱。我需要一个结果集。id列是自动生成的。我需要表A和表B基本上合并到表C中。提供的代码当前生成结果集表A。那么为什么ID会改变呢?为什么不直接使用b的id呢?把SELECT放在第三个APPLY和join放在一边:否则NULL在某种情况下是不必要的,尽管它确实让它更清晰一些