在SQL中标记结果

时间:2016-06-20 11:31:14

标签: sql sql-server

我有一个地址表,我想标记与另一个表中的城镇相匹配的行。如果可能,请告知您是否需要这些代码。

示例表:

数据表

 Fname Surname Town        Postcode   Flag
 Alan  Jones   Colchester  CO1 2RT
 Steve Smith   Lincoln     LN23 7TY
 Jeff  Lilly   Swindon     SN1 6LK
 Sarah Thomas  Lincoln     LN56 9TT

城镇名表

TownNames    
Lincoln
Swindon

因此,在上面的示例Steve Smith中,Jeff LillySarah Thomas应返回" X"在标志栏中。

2 个答案:

答案 0 :(得分:3)

试试这个:

SELECT a.Fname, a.Surname, a.Town, a.Postcode, 
       CASE t.TownNames IS NOT NULL THEN 'X' ELSE '' END AS Flag
FROM Address AS a LEFT JOIN Towns AS t ON a.Town = t.TownNames;

答案 1 :(得分:1)

如果您想直接在表格中执行此操作,则可以创建一个persisted computed column来为您执行此操作。您必须执行一项功能来执行您之后的计算(CASEIF EXISTS)。

计算列的优势在于它会保持最新状态,您不必定期更新以确保它在那里。

功能

CREATE FUNCTION dbo.TownCheck (@Town VARCHAR(1))
RETURNS VARCHAR(1) 
AS BEGIN
    DECLARE @TownExists VARCHAR(1)

    SELECT @TownExists = MAX('X') FROM dbo.TownNames WHERE TownName = @Town

    RETURN @TownExists
END

让我们制作您的样本数据;

CREATE TABLE DataTable (Fname varchar(5), Surname varchar(6), Town varchar(10), Postcode varchar(8), Flag varchar(1))
INSERT INTO DataTable (Fname, Surname, Town, Postcode)
VALUES
('Alan','Jones','Colchester','CO1 2RT')
,('Steve','Smith','Lincoln','LN23 7TY')
,('Jeff','Lilly','Swindon','SN1 6LK')
,('Sarah','Thomas','Lincoln','LN56 9TT')

第二张表;

CREATE TABLE TownNames (TownName varchar(10))
INSERT INTO TownNames
VALUES 
('Lincoln')
,('Swindon')

您无法更改列以进行计算,因此您必须将其删除,然后重新创建它(我假设您已经拥有此表,如果您不这样做,请执行此操作表的创建点;)

ALTER TABLE dbo.DataTable
DROP COLUMN Flag

ALTER TABLE dbo.DataTable
ADD Flag AS dbo.TownCheck(Town)

现在你的DataTable看起来像这样;

Fname   Surname Town        Postcode    Flag
Alan    Jones   Colchester  CO1 2RT     NULL
Steve   Smith   Lincoln     LN23 7TY    X
Jeff    Lilly   Swindon     SN1 6LK     X
Sarah   Thomas  Lincoln     LN56 9TT    X

编辑:

如果更新了TownNames表,这将有效。如果您插入缺少的城镇;

INSERT INTO TownNames
VALUES ('Colchester')

你得到这个结果;

Fname   Surname Town        Postcode    Flag
Alan    Jones   Colchester  CO1 2RT     X
Steve   Smith   Lincoln     LN23 7TY    X
Jeff    Lilly   Swindon     SN1 6LK     X
Sarah   Thomas  Lincoln     LN56 9TT    X

进一步阅读;

define a computed column reference another table