【问题标题】:Append string to existing value in column of type nvarchar将字符串附加到 nvarchar 类型的列中的现有值
【发布时间】:2019-06-14 19:47:30
【问题描述】:

我在 Microsoft SQL Server 2016 DB 中有一个数据库表“table_2”。

CREATE TABLE table_2
(
    [created_date] [date] NULL,
    [complete_hour] [int] NULL,
    [col_percent] [float] NULL,
    [notes] [nvarchar] (400)
)

INSERT INTO table_2
VALUES ('2017-05-31', 10, 5.8, 'A'),
       ('2019-06-14', 11, 9.9, NULL)

现在我想将', B' 附加到列注释中的值,如果列注释的值是:

  1. NOT NULL 和
  2. 非空且
  3. 不是“B”

如果列注释具有 NULL 值,我想在列注释中添加/插入/附加“B”。

我尝试过的:

UPDATE table_2 
SET notes=notes+', '+'B' 
WHERE col_percent = 5.8

但它会抛出错误:

消息 8152,第 16 级,第 13 州,第 14 行
字符串或二进制数据将被截断。

当我尝试时

UPDATE table_2 
SET notes=notes+', '+'B' 
WHERE col_percent = 9.9

它显示(1 row affected),但我看到相同的数据和列注释在第二行仍然有 NULL。

我环顾四周,似乎将列注释的数据类型从 nvarchar 更改为 varchar(50) 将解决此问题。 (我已经测试过了)但在实际情况下我无法更改数据类型。

问题:如何在不更改列注释数据类型的情况下做到这一点?

更新:将注释列声明为[notes] [nvarchar] (400)。这解决了列注释中非空值的问题。

但对于 NULL 值(如 col_percent = 9.9),它显示 (1 row affected) 但数据未更改。

Zeina 的解决方案在 notes 列为 NULL 时会更新,但它也会添加前导逗号。

我最终使用的解决方案(可能有比这更好的解决方案):

UPDATE table_2  
   SET notes = CASE
                   WHEN notes = 'B'   THEN 'B'
                   WHEN notes IS NULL THEN 'B' 
                   WHEN notes = ''    THEN 'B' 
                   ELSE notes+', '+'B'
               END 
 WHERE col_percent = 5.8

【问题讨论】:

  • 既然是nvarchar,你也应该将你的文字字符串声明为nvarchar;这意味着在你的字符串前面加上一个 N:N'Your Literal String'

标签: sql sql-server-2016


【解决方案1】:

必须更改notes 的类型。目前,您已将notes 定义为:

[notes] [nvarchar] NULL

您没有包含长度,因此 SQL Server 使用默认长度。在这种情况下,默认长度为 1,因此您只能在列中存储一个字符。

然后处理NULL 值,使用CASE

UPDATE table_2
    SET notes = (CASE WHEN notes IS NOT NULL THEN notes + ', ' +'B'
                 END)
    WHERE col_percent = 9.9;

或者,更好:

UPDATE table_2
    SET notes = notes + ', ' +'B'
    WHERE col_percent = 9.9 AND notes IS NOT NULL;

【讨论】:

  • 感谢您的回复戈登林诺夫。我现在已经声明了带有长度的注释列,并且确实为列注释中的非 NULL 值解决了它。对于 NULL 值(如 col_percent = 9.9),它显示(受影响的 1 行)但数据未更改。 Zeina 的解决方案也在更新 NULL 值。所以我只是想为 NULL 和 NOT NULL 想出一个 SQL。
  • @300 。 . .那部分很容易。只需使用COALESCE()
  • 使用COALESCE() 正在更新NULL,但正在添加, B。我希望在将 NULL 和 , B 附加到 NON NULL 的现有值时添加 B。正如我在回复中提到的那样,我最终为此使用了 CASE 语句。 COALESCE() 也可以做一些修改,但我没有尝试。此外,我在 COALESCE() 中将 + 替换为 ' 以更正您建议中的语法错误。
  • @300 。 . .如果将条件移至WHERE 子句,您甚至不需要CASE
【解决方案2】:
UPDATE table_2 SET notes=ISNULL(notes, '') + ', B' WHERE col_percent=9.9

由于 NULL 在操作中与任何其他值一起被视为 NULL。所以我们必须首先为 NULL 单元格设置一个默认值,然后将 B 附加到它。

如果您只需要在字段为 NULL 时放置“B”,则可以使用以下语法:

UPDATE table_2 
SET notes =
           (CASE WHEN ISNULL(notes, '') = '' THEN 'B' 
                 ELSE ISNULL(notes, '') + ', B' END)
WHERE col_percent=9.9

【讨论】:

  • 感谢您的回复 Zeina。你的建议最接近我想要的。唯一的问题是我不能使用相同的 SQL 来更新 NULL 值,因为它会添加, B。如果为 NULL,我只想添加 B。试图看看我是否可以使用单个 SQL 处理 NULL 和 NOT NULL。
猜你喜欢
  • 1970-01-01
  • 2014-02-24
  • 2021-02-08
  • 2018-09-13
  • 1970-01-01
  • 2022-12-13
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
相关资源
最近更新 更多