TSQL:如果Column = Null,如何返回两行

时间:2017-05-11 07:58:43

标签: tsql

我必须构建一个在最后返回表的过程,其中包含应用特定物质的字段列表。我需要为每个字段和应用的物质返回一行。 这适用于实际应用某些内容的所有字段,但我还需要为这些字段显示相同数量的行,没有应用任何内容。

目前我得到一张这样的桌子:

Field 1 | Substance 1 | 12345 kg
Field 1 | Substance 2 | 23423 kg
Field 2 | Substance 1 | 23236 kg
Field 2 | Substance 2 | 12312 kg
Field 3 | NULL        | NULL

我知道我可以通过制作一个Case-Condition将NULL值与至少一个Substance交换,但我需要两行(一个用于Substance 1,一个用于Substance 2),其中包含每个物质的名称。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:1)

或许你有这样的事情:

CREATE TABLE Fields (
    FieldID INT PRIMARY KEY,
    FieldName VARCHAR(50) NOT NULL UNIQUE,
)

INSERT INTO dbo.Fields (FieldID, FieldName) VALUES
(1, 'Field 1'),
(2, 'Field 2'),
(3, 'Field 3')

CREATE TABLE dbo.Substances (
    SubstanceID INT PRIMARY KEY,
    Substance VARCHAR(50) NOT NULL UNIQUE
)

INSERT INTO dbo.Substances (SubstanceID, Substance) VALUES
(1, 'Substance 1'),
(2, 'Substance 2')

CREATE TABLE AppliedSubstances (
    FieldID INT NOT NULL REFERENCES dbo.Fields,
    SubstanceID INT NOT NULL REFERENCES dbo.Substances,
    Quantity INT NOT NULL
)

INSERT INTO dbo.AppliedSubstances (FieldID, SubstanceID, Quantity) VALUES 
(1, 1, 12345),
(1, 2, 23423),
(2, 1, 23236),
(2, 2, 12312)

然后您可以使用以下查询:

SELECT f.FieldName, s.Substance, a.Quantity
FROM dbo.AppliedSubstances a
INNER JOIN dbo.Fields f ON f.FieldID = a.FieldID
INNER JOIN dbo.Substances s ON s.SubstanceID = a.SubstanceID
UNION ALL
SELECT f.FieldName, s.Substance, NULL AS Quantity
FROM dbo.Fields f
CROSS JOIN dbo.Substances s
WHERE NOT EXISTS (
    SELECT * FROM dbo.AppliedSubstances a
    WHERE a.FieldID=f.FieldID AND a.SubstanceID=s.SubstanceID
)

或者是较短的陌生人版本(如果你有一些只适用于某些领域的物质,则含义不同):

SELECT f.FieldName, s.Substance, a.Quantity
FROM dbo.AppliedSubstances a
RIGHT JOIN dbo.Fields f ON f.FieldID = a.FieldID
INNER JOIN dbo.Substances s ON s.SubstanceID = ISNULL(a.SubstanceID,s.SubstanceID)

答案 1 :(得分:0)

我不确定我是否正确理解了你的问题,但试试这个:

CREATE TABLE SourceData (
    FieldName VARCHAR(50),
    Substance VARCHAR(50),
    Quantity INT
)

INSERT INTO dbo.SourceData (FieldName, Substance, Quantity) VALUES 
('Field 1', 'Substance 1', 12345),
('Field 1', 'Substance 2', 23423),
('Field 2', 'Substance 1', 23236),
('Field 2', 'Substance 2', 12312),
('Field 3', NULL, NULL)

SELECT FieldName, Substance, Quantity
FROM dbo.SourceData WHERE Substance IS NOT NULL
UNION ALL
SELECT s1.FieldName, x.Substance, NULL AS Quantity
FROM dbo.SourceData s1 CROSS JOIN (
    SELECT DISTINCT s2.Substance 
    FROM dbo.SourceData s2
    WHERE s2.Substance IS NOT NULL
) x
WHERE s1.Substance IS NULL