表格,我有一种方法让我有一个字符串并在另一个表中的多个列中检查,从1开始,直到我获得匹配?
?我有几个字段的表格
Medicine
-----------
Advil
Tylenol
Midol
我需要在另一个桌子上检查它,然后检查列,以便上面的药物。
MedsToTry1 | MedsToTry2 | MedsToTry3 | MedsToTry4 | MedsToTry5 | MedsToTry6 |
------------|------------|------------|------------|------------|------------|
NotAdvil Advil Null Null Null Null
Tylenol Ibuprofen NotTylenol Null Null Null
NotMidol NotAdvil Ibuprofen Midol Null Null
因此,我必须浏览第一个表中的每个字段,并在" medstotry1"字段中搜索它们,如果不是,则在" medstotry2"上,依此类推,直到找到。
我尝试在Medstotry字段中的所有字符串上进行串联并在其中搜索字符串,但不能保证它会按顺序进行,我需要首先检查'Medstotry1'。
我试图使用cocece,但它返回了Medstotry1上的田地,因为它们都不是空的,但不会去Medstotry2看看它是否在那里。
我有办法做到这一点吗?从另一个表中的多个列中有一个字符串并在我获得匹配的顺序中检查吗?
如果我需要提供更多信息,请告诉我。我是SQL的新手,所以我可以接受任何帮助。
谢谢。
您的表是 - 可能 - 不是真实的源表。如果您可以对此进行查询,那就更好了。这是 - 再次我的猜测 - pivot 操作的结果,其中a row-wise 表被转换为a 并排或列格式。
您没有说明预期的输出。下一次,或者要改进这个问题,请查看我的代码,并尝试准备一个独立的示例以自己复制您的问题。这次我为您做了:
首先,我们必须声明模型表才能模拟您的问题:
DECLARE @tblA TABLE(Medicine VARCHAR(100));
INSERT INTO @tblA VALUES
('Advil')
,('Tylenol')
,('Midol');
DECLARE @tblB TABLE(RowId INT,MedsToTry1 VARCHAR(100),MedsToTry2 VARCHAR(100),MedsToTry3 VARCHAR(100),MedsToTry4 VARCHAR(100),MedsToTry5 VARCHAR(100),MedsToTry6 VARCHAR(100));
INSERT INTO @tblB VALUES
(1,'NotAdvil','Advil',Null,Null ,Null,Null)
,(2,'Tylenol','Ibuprofen','NotTylenol',Null ,Null,Null)
,(3,'NotMidol','NotAdvil','Ibuprofen','Midol',Null,Null);
- 这是查询(使用您自己的表名称在您的环境中对此进行测试(
SELECT B.RowId
,C.*
FROM @tblB b
CROSS APPLY (VALUES(1,b.MedsToTry1)
,(2,b.MedsToTry2)
,(3,b.MedsToTry3)
,(4,b.MedsToTry4)
,(5,b.MedsToTry5)
,(6,b.MedsToTry6)) C(MedRank,Medicin)
WHERE EXISTS(SELECT 1 FROM @tblA A WHERE A.Medicine=C.Medicin);
简而言之:
CROSS APPLY (VALUES...
的技巧将返回每个 numbered 列(medstotry1,medstotry2 ...(一排,等级。这样,我们就不会丢失排序顺序或表格中的位置的信息。
WHERE
将将集合减少到另一个表中存在相应药物的行。
结果
RowId MedRank Medicin
1 2 Advil
2 1 Tylenol
3 4 Midol