Lấy một cột được tính toán dựa trên một số cột không thể


7

Tôi là một chút của một người mới SQL.

Tôi đã cố gắng tạo một cột được tạo tự động được gọi TAGtừ 5 cột khác, một số cột có thể giữ lại các dấu NULL.

Cú pháp được sử dụng để tạo cột được tạo tự động là:

[Tag]  AS ([Tag Type]+[Parent Tag Type]+[Tag Area No]+[Tag seq No]+[Tag Suffix])

Điều này tự động phát sinh OK nếu không có cột nào trong số năm cột giữ lại NULL, nhưng nếu tôi cố gắng tạo một hàng với bất kỳ một cột nào chứa NULL, thì trình tạo tự động không hoạt động và để TAGtrống cột, mặc dù nó tạo ra hàng OK với tất cả các dữ liệu cột cá nhân.

Có cách nào để tôi có thể tạo tự động để làm việc với NULL không?

Câu trả lời:


8

Bạn có thể sử dụng CONCAThàm trong SQL Server 2012 trở lên, tự động bỏ qua NULLvà chuyển đổi hoàn toàn đầu vào thành các kiểu chuỗi nếu cần.

Ví dụ :

CREATE TABLE #Demo
(
    [Tag Type] char(1) NOT NULL,
    [Parent Tag Type] char(1) NULL,
    [Tag Area No] integer NOT NULL,
    [Tag seq No] integer NOT NULL,
    [Tag Suffix] char(1) NULL,

    [Tag] AS 
        CONCAT([Tag Type], [Parent Tag Type], [Tag Area No], [Tag seq No], [Tag Suffix])
);

INSERT #Demo
    ([Tag Type], [Parent Tag Type], [Tag Area No], [Tag seq No], [Tag Suffix])
VALUES
    ('T', NULL, 1234, 1, NULL),
    ('T', 'P', 5678, 1, 'S');

SELECT * FROM #Demo AS D;

Đầu ra:

Loại thẻ | Loại thẻ phụ huynh | Khu vực thẻ số | Tag seq Không | Tag Suffix | Nhãn     
: ------- | : -------------- | ----------: | ---------: | : --------- | : -------
T | null             | 1234 | 1 | null        | T12341  
T | P | 5678 | 1 | S | TP56781S

... và chỉ trong trường hợp ví dụ đã được đơn giản hóa và một dấu phân cách để đi giữa các phần tử, hãy xem phần CONCAT_WS()giới thiệu trong SQL Server 2017.


6

Có, bạn sẽ cần sử dụng ISNULLđể làm điều đó:

ISNULL([Tag Type], '') +
ISNULL([Parent Tag Type], '') +
ISNULL([Tag Area No], '') +
ISNULL([Tag seq No], '') +
ISNULL([Tag Suffix], '')

Nhưng cảnh báo công bằng, nếu bất kỳ hàng nào có NULLtoàn bộ, bạn sẽ kết thúc bằng một chuỗi trống. Bạn có thể muốn bọc toàn bộ mọi thứ ISNULLbằng một giá trị canary để tránh điều đó nếu cần thiết.

Tùy thuộc vào loại dữ liệu, bạn cũng có thể cần CONVERTcác cột của mình thành một loại chuỗi bên trong ISNULLđể tránh lỗi.


Hoàn toàn đồng ý. Pro-tip: thực hiện theo cách này (hoặc cách OP) có một vấn đề: thẻ cho Area = Null, Seq = 1 giống như Area = 1, Seq = Null. Điều này sẽ không bao giờ xảy ra với bạn tất nhiên - cho đến khi nó xảy ra. Dù sao, nó cũng đủ dễ để sửa: chỉ cần thêm vào một dấu tách (ISNULL (khác, '') + '~' + ISNULL ...), HOẶC một giá trị cho NULL sẽ không bao giờ xảy ra với dữ liệu thực. như ISNULL (Hoài, '~') + ISNULL ...
Stu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.