0

我有一种情况,我必须在不丢失任何数据的情况下合并两个表。这两个表具有不同的结构。以下是我的表的结构

TABLE A 
ID_NO INT,
Ship_Date DATE,
Status varchar(10),
total decimal(12,2)

TABLE B
ID_NO INT,
Status varchar(10),
total decimal(12,2)

我尝试通过在表 B 中包含一个虚拟列来使用 UNION ALL,如下所示

TABLE B
ID_NO INT,
'',
Status varchar(10),
total decimal(12,2)

但在结果集中,我得到 1900-01-01 作为 Ship_Date 而不是“”。如何消除这种情况?

4

3 回答 3

5

使用 NULL 值而不是空字符串。如果您不介意将 Ship_Date 结果作为字符串,则可以将 UNION 包装在另一个 select 语句中。

SELECT U._ID_NO, 
       CASE WHEN U.Ship_Date IS NULL 
               THEN ''
               ELSE CONVERT(NVARCHAR(50), U.Ship_Date,101) END AS Ship_Date,
       U.Status, 
       U.total 
FROM
(
  SELECT A.ID_NO, A.Ship_Date, A.Status, A.total 
  FROM TableA

  UNION ALL

  SELECT B.ID_NO, NULL AS Ship_Date, B.Status, B.total 
  FROM TableB
) AS U
于 2012-07-17T15:51:50.147 回答
2

Ship_Date是一种date数据类型,为什么不用NULL作虚拟占位符呢?

TABLE B
ID_NO INT,
NULL,
Status varchar(10),
total decimal(12,2)
于 2012-07-17T15:51:28.280 回答
2

你得到1900-01-01是因为该列类型是 DATETIME。如果您希望它是“空的”,请使用NULL而不是。''

尝试:

select 
    ID_NO,
    case
        when Ship_Date is NULL then ''
       else Ship_Date
    end as Ship_Date,
    Status,
    total
from
(
    select
        ID_NO,
        Ship_Date,
        Status,
        total
    from
        table_a

    union all

    select
        ID_NO,
        NULL as Ship_Date,
        Status,
        total
    from
        table_b 
) combined
于 2012-07-17T15:51:28.090 回答