【问题标题】:Inserting a string value and formatted string into table using the same insert statement使用相同的插入语句将字符串值和格式化字符串插入表中
【发布时间】:2021-02-14 05:17:43
【问题描述】:

我有一个作业问题,说明如下:

用数据填充表格,确保至少有 5 个人、至少 8 个帖子和至少 4 个赞。确保使用序列来生成主键值。大多数字段都是不言自明的。至于 Post 中的“内容”字段,随意设置,例如“看看这些新照片”或“刚到巴哈马”,并将摘要设置为内容的前 12 个字符,后跟“……”。

对于这个问题,我有一张表叫 Post:

CREATE TABLE Post
(
    post_id decimal(12) NOT NULL PRIMARY KEY
    , person_id decimal(12) NOT NULL FOREIGN KEY REFERENCES Person(person_id)
    , content varchar(255) NOT NULL
    , created_on date NOT NULL
    , summary varchar(15) NOT NULL 
)

对于这个作业问题,我正在尝试找出如何解决一个问题:“将摘要设置为内容的前 12 个字符,后跟“...”。”。基本上,我试图通过取前 12 个字符在摘要字段上写入内容

我有这个插入语句:

INSERT INTO Post (post_id, person_id, content, created_on, summary)
VALUES
(NEXT VALUE FOR Post_seq, 1, 'Take a look at these new pics', GETDATE(), SUBSTRING('Take a look at these new pics', 1, 12) + '...')

我尝试这样做是为了避免重复

INSERT INTO Post (post_id, person_id, content, created_on, summary)
VALUES
(NEXT VALUE FOR Post_seq, 1, 'Take a look at these new pics', GETDATE(), SUBSTRING(content, 1, 12) + '...')

但是这个插入语句不起作用,因为它不知道内容是什么。在我插入的相同值上应用格式的最佳方法是什么,而不必在同一个插入语句中再次编写它?任何帮助将不胜感激。

提前致谢

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    通常你会为此使用一个变量(实际上你所有的插入参数都来自用户):

    DECLARE @Content varchar(255) = 'Take a look at these new pics';
    
    INSERT INTO Post (post_id, person_id, content, created_on, summary)
        VALUES (NEXT VALUE FOR Post_seq, 1, @Content, GETDATE(), SUBSTRING(@Content, 1, 12) + '...');
    

    对于奖励积分,请勿添加 ...,除非发生某些连接,例如

    DECLARE @Content varchar(255) = 'Take a look at these new pics';
    
    INSERT INTO Post (post_id, person_id, content, created_on, summary)
        VALUES (NEXT VALUE FOR Post_seq, 1, @Content, GETDATE(), SUBSTRING(@Content, 1, 12) + CASE WHEN LEN(@Content) > 12 then '...' else '' end);
    

    或使用子查询,例如

    INSERT INTO Post (post_id, person_id, content, created_on, summary)
        SELECT NEXT VALUE FOR Post_seq, 1, X.content, GETDATE()
            , SUBSTRING(X.content, 1, 12) + CASE WHEN LEN(X.content) > 12 then '...' else '' end
        FROM (
            SELECT 'Take a look at these new pics' as content
        ) X;
    

    【讨论】:

      【解决方案2】:

      简单的方法是进行两次查询。

      INSERT INTO Post (post_id, person_id, content, created_on)
      VALUES
      (NEXT VALUE FOR Post_seq, 1, 'Take a look at these new pics', GETDATE());
      
      UPDATE Post SET summary = SUBSTRING(content, 1, 12) + '...';
      

      那个 UPDATE 会做所有的记录。如果您的 SQL 数据库有“最后一条记录的记录 id”,您可以使用它来将 UPDATE 限制为您刚刚添加的那个。

      【讨论】:

        猜你喜欢
        • 2010-11-16
        • 2017-11-09
        • 2022-07-05
        • 1970-01-01
        • 1970-01-01
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多