在SQL Server中,如何根据列值是否包含某个值来更改列值?

时间:2017-06-13 18:56:55

标签: sql sql-server

很抱歉,如果标题有点令人困惑......我正在尝试修复一些数据。以下是解释:

说我有两张桌子。

  • 第一个是不再使用的查找表。
  • 第二个有一个varchar(50)列,有时候有产品名称和 有时来自旧查找表的产品ID。

我们的想法是将Product表中的所有PID值转换为产品名称。这是我用来帮助说明它的图片:enter image description here

查找表要大得多,这只是一个例子。所以我猜它会是一个更新语句,如果发现ProductLate在ProductsLookup.PID集中,它将使用ProductsLookup.Name值?这看起来怎么样?

非常感谢你的帮助, 卡洛斯

2 个答案:

答案 0 :(得分:0)

您可以使用updatejoin

执行此操作
update p
    set product = pl.name
    from products p join
         productslookup pl
         on pl.pid = p.id;

不需要left join,因为您只需要更新查找表中匹配的值。

我会提醒您,性能可能是一个问题。问题是两个表之间的类型 - 大概pid是一个不是字符串的数字。如果是这样,您可以创建一个计算列来更改该列的类型和索引。

答案 1 :(得分:0)

您需要在PID和Product列上将这些表“ProductsLookup”和“Products”放在内部联接中。但是“Products”表中的Product列是varchar,因此您必须在此列上应用ISNUMERIC函数以确保连接正常工作。以下是示例

UPDATE
    P
SET
    P.Product=PL.Name
FROM
    Products P
    INNER JOIN ProductsLookup PL ON PL.PID=CASE WHEN ISNUMERIC(P.Product)=1 THEN P.Product ELSE -1 END