2017-03-29 31 views
0

我有一个电话号码搜索查询在SQL中,我想知道我怎么能有一列显示在什么字段数据被发现。有什么办法可以做到这一点? 这是我的查询:SQL查询 - 返回数据被发现的字段

Select DISTINCT ST.SCHOOLID, 
ST.STUDENT_NUMBER, 
ST.LASTFIRST, 
ST.GRADE_LEVEL 
FROM PS.STUDENTS ST 
LEFT OUTER JOIN PS.U_GUARDIANS GA 
ON ST.DCID = GA.STUDENTSDCID 
LEFT OUTER JOIN PS.U_DEMO DE 
ON ST.DCID = DE.STUDENTSDCID 
LEFT OUTER JOIN PS.U_EMERGENCY EME 
ON ST.DCID = EME.STUDENTSDCID 
LEFT OUTER JOIN PS.U_STUDENT_HISTORY PREV 
ON ST.DCID = EME.STUDENTSDCID 
WHERE ST.Home_Phone LIKE '%param1%' 
OR DE.STUDENT_CELL LIKE '%param1%' 
OR GA.G1_PHONE1 LIKE '%param1%' 
OR GA.G1_PHONE2 LIKE '%param1%' 
OR GA.G1_WORK_PHONE LIKE '%param1%' 
OR GA.G2_PHONE1 LIKE '%param1%' 
OR GA.G2_PHONE2 LIKE '%param1%' 
OR GA.G2_WORK_PHONE LIKE '%param1%' 
OR GA.G3_PHONE1 LIKE '%param1%' 
OR GA.G3_PHONE2 LIKE '%param1%' 
OR GA.G3_WORK_PHONE LIKE '%param1%' 
OR GA.G4_PHONE1 LIKE '%param1%' 
OR GA.G4_PHONE2 LIKE '%param1%' 
OR GA.G4_WORK_PHONE LIKE '%param1%' 
OR EME.EC1_Phone1 LIKE '%param1%' 
OR EME.EC1_Phone2 LIKE '%param1%' 
OR EME.EC2_Phone1 LIKE '%param1%' 
OR EME.EC2_Phone2 LIKE '%param1%' 
OR EME.EC3_Phone1 LIKE '%param1%' 
OR EME.EC3_Phone2 LIKE '%param1%' 
OR PREV.Prev_School_Phone LIKE '%param1%' 
OR PREV.Prev_School_Fax LIKE '%param1%' 
OR ST.Doctor_Phone LIKE '%param1%' 
order by ST.lastfirst 

谢谢

回答

0

一种方法是使用一个CROSS APPLY

Select DISTINCT 
    ST.SCHOOLID, 
    ST.STUDENT_NUMBER, 
    ST.LASTFIRST, 
    ST.GRADE_LEVEL, 
    C.Col -- Column name 
FROM PS.STUDENTS ST 
LEFT OUTER JOIN PS.U_GUARDIANS GA 
    ON ST.DCID = GA.STUDENTSDCID 
LEFT OUTER JOIN PS.U_DEMO DE 
    ON ST.DCID = DE.STUDENTSDCID 
LEFT OUTER JOIN PS.U_EMERGENCY EME 
    ON ST.DCID = EME.STUDENTSDCID 
LEFT OUTER JOIN PS.U_STUDENT_HISTORY PREV 
    ON ST.DCID = EME.STUDENTSDCID 
CROSS APPLY 
(
    VALUES 
    ('ST.Home_Phone', ST.Home_Phone), 
    ('DE.STUDENT_CELL', DE.STUDENT_CELL), 
    ('GA.G1_PHONE1', GA.G1_PHONE1), 
    ('GA.G1_PHONE2', GA.G1_PHONE2), 
    ('GA.G1_WORK_PHONE', GA.G1_WORK_PHONE), 
    ('GA.G2_PHONE1', GA.G2_PHONE1), 
    ('GA.G2_PHONE2', GA.G2_PHONE2), 
    ('GA.G2_WORK_PHONE', GA.G2_WORK_PHONE), 
    ('GA.G3_PHONE1', GA.G3_PHONE1), 
    ('GA.G3_PHONE2', GA.G3_PHONE2), 
    ('GA.G3_WORK_PHONE', GA.G3_WORK_PHONE), 
    ('GA.G4_PHONE1', GA.G4_PHONE1), 
    ('GA.G4_PHONE2', GA.G4_PHONE2), 
    ('GA.G4_WORK_PHONE', GA.G4_WORK_PHONE), 
    ('EME.EC1_Phone1', EME.EC1_Phone1), 
    ('EME.EC1_Phone2', EME.EC1_Phone2), 
    ('EME.EC2_Phone1', EME.EC2_Phone1), 
    ('EME.EC2_Phone2', EME.EC2_Phone2), 
    ('EME.EC3_Phone1', EME.EC3_Phone1), 
    ('EME.EC3_Phone2', EME.EC3_Phone2), 
    ('PREV.Prev_School_Phone', PREV.Prev_School_Phone), 
    ('PREV.Prev_School_Fax', PREV.Prev_School_Fax), 
    ('ST.Doctor_Phone', ST.Doctor_Phone) 
) AS C(Col, Val) 
WHERE C.Val LIKE '%param1%' 
ORDER BY ST.lastfirst; 

如果列的类型是不一样的类型(例如,一个是整数),这可能会引发错误,在这种情况下,您需要将交叉应用中的列转换为相同的类型。

此方法还会为每个匹配的列重复行(例如,如果它与列A和B匹配,您将获得一行val1,val2,val3,val4,A和一行val1,val2 ,val3,val4,B)。如果这是一个问题,可以稍微调整交叉应用的工作方式来解决这个问题。

编辑:

举个例子样本数据,运行这将显示您的查询应该做的:

DECLARE @T TABLE 
(
    SchoolID INT NOT NULL, Student_Number INT NOT NULL, LastFirst INT NOT NULL, Grade_Level INT NOT NULL, 
    Home_Phone VARCHAR(255), Student_Cell VARCHAR(255), Phone1 VARCHAR(255), Phone2 VARCHAR(255), Phone3 VARCHAR(255), 
    Phone4 VARCHAR(255), RandomColumnName VARCHAR(255), ABCDEFGHIJKL VARCHAR(255) 
); 

INSERT @T (SchoolID, Student_Number, LastFirst, Grade_Level, Home_Phone, Student_Cell, Phone1, Phone2, Phone3, Phone4, RandomColumnName, ABCDEFGHIJKL) VALUES 
(1, 1, 1, 1, NULL, NULL, NULL, NULL, NULL, 'sdgfagagparam1sdasf', NULL, NULL), 
(1, 1, 1, 2, NULL, NULL, NULL, NULL, 'asdfparam1sadf', NULL, NULL, NULL), 
(1, 1, 1, 3, NULL, NULL, 'param1asdf', NULL, NULL, NULL, NULL, NULL), 
(1, 1, 2, 1, NULL, NULL, NULL, NULL, NULL, NULL, 'adfparam1', NULL), 
(1, 1, 2, 2, NULL, 'qqqparam1', NULL, NULL, NULL, NULL, NULL, NULL), 
(1, 2, 1, 2, NULL, NULL, NULL, NULL, 'param1', NULL, NULL, 'param1'), 
(2, 1, 1, 2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); 

SELECT DISTINCT 
    T.SchoolID, 
    T.Student_Number, 
    T.LastFirst, 
    T.Grade_Level, 
    C.Col 
FROM @T AS T 
CROSS APPLY 
(
    VALUES 
    ('Home_Phone', Home_Phone), 
    ('Student_Cell', Student_Cell), 
    ('Phone1', Phone1), 
    ('Phone2', Phone2), 
    ('Phone3', Phone3), 
    ('Phone4', Phone4), 
    ('RandomColumnName', RandomColumnName), 
    ('ABCDEFGHIJKL', ABCDEFGHIJKL) 
) AS C(Col, Val) 
WHERE C.Val LIKE '%param1%'; 
+0

谢谢您的帮助!我试着使用上面的代码,我想知道我应该输入C.Col - 列名?这只是我想在该列上使用的名称,因为这不是数据库上的字段,而只是我要添加的一列来返回字段名称。对不起,我仍然在SQL的基础知识。无论如何,我尝试使用上面的代码,并将C.Col - 列名称替换为C.Field,并为该列添加了标题,但是当我尝试搜索时不返回任何内容。我也尝试删除不同的查询,但也没有返回任何东西。 – Debora

+0

对不起,当你运行上面的代码而没有改变任何东西时,我期望它能正常工作。该评论只是一个评论,向您展示了您在运行时应该看到的内容。当您在不更改任何内容的情况下运行上述查询时,是否仍然没有结果? – ZLK

+0

我编辑了一个带有示例数据的简单示例,以显示您的查询在运行时应显示的内容。 – ZLK