【问题标题】:Make a column receives 0 or 1 based on the value of another column使一列根据另一列的值接收 0 或 1
【发布时间】:2017-03-23 08:55:44
【问题描述】:

我想知道是否可以在表中创建一个列,它会根据同一个表中另一列的值自动获取它们的值,下面的示例进行说明:

CREATE TABLE dbo.example
(
    m_id INT NOT NULL CONSTRAINT PK_mid PRIMARY KEY IDENTITY (1,1),
    m_name NVARCHAR(30) NOT NULL,
    m_startdate DATE NOT NULL CONSTRAINT CHK_startdate CHECK(m_startdate <= SYSDATETIME()),
    m_enddate DATE CONSTRAINT CHK_enddate CHECK(m_enddate <= SYSDATETIME()),
    m_status INT CONSTRAINT CHK_status CHECK(m_status = 0 or m_status = 1)
)

如果 m_enddate 为空,我想让 m_status 接收 0,如果它不为空,则接收 1。这当然是在插入一行时。

【问题讨论】:

标签: sql-server


【解决方案1】:

您可以按如下方式使用计算列...

 CREATE TABLE dbo.example
(
m_id INT NOT NULL CONSTRAINT PK_mid PRIMARY KEY IDENTITY (1,1),
m_name NVARCHAR(30) NOT NULL,
m_startdate DATE NOT NULL CONSTRAINT CHK_startdate CHECK(m_startdate <= SYSDATETIME()),
m_enddate DATE CONSTRAINT CHK_enddate CHECK(m_enddate <= SYSDATETIME()),
m_status AS CASE
    WHEN m_enddate is null THEN 0 ELSE 1 
    END 
)

【讨论】:

    【解决方案2】:

    Michael 建议的计算列是最好的,但如果您无法更改表格,那么您可以为此创建一个视图。

    CREATE VIEW dbo.vwExample AS
      SELECT m_id,
             m_name,
             m_startdate,
             m_enddate,
             CASE WHEN m_enddate is null THEN 0 ELSE 1 END as m_status
      FROM   dbo.example
    

    现在你可以做

     select * from dbo.vwExample  
    

    它会为 m_status 提供正确的值,而无需更改表本身。

    【讨论】:

      【解决方案3】:

      在 T-SQL 中,您可以使用而不是插入/更新触发器,它允许您拦截插入和更新并注入逻辑。

      CREATE TRIGGER dbo.exampleInsertTrigger
         ON   [dbo].[example]
         INSTEAD OF INSERT
      AS 
      BEGIN
      INSERT INTO [dbo].[example]
          ([m_name]
          ,[m_startdate]
          ,[m_enddate]
          ,[m_status])
      SELECT
          [m_name]
          ,[m_startdate]
          ,[m_enddate]
          ,CASE
          WHEN [m_enddate] is null THEN 0 ELSE 1 
          END
      FROM inserted
      END
      
      
      CREATE TRIGGER dbo.exampleUpdateTrigger
         ON   dbo.example
         INSTEAD OF UPDATE
      AS 
      BEGIN
      UPDATE [dbo].[example]
          SET
          [m_name] = inserted.[m_name]
          ,[m_startdate] = inserted.[m_startdate]
          ,[m_enddate] = inserted.[m_enddate]
          ,[m_status] = CASE
          WHEN inserted.[m_enddate] is null THEN 0 ELSE 1 
          END
      FROM inserted
      WHERE inserted.[m_id] = [dbo].[example].[m_id]
      END
      

      【讨论】:

        猜你喜欢
        • 2018-01-07
        • 2017-12-31
        • 1970-01-01
        • 2018-08-10
        • 1970-01-01
        • 2022-11-24
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多