【问题标题】:SQL - moving table data using INSERT INTO - checking values before movingSQL - 使用 INSERT INTO 移动表数据 - 在移动之前检查值
【发布时间】:2014-04-30 16:51:18
【问题描述】:

我正在做一些实验,使用 INSERT INTO 将值从一个表移动到另一个表,但我不太确定如何在将旧表中的值(并添加一个字符串)移动到新表之前检查它.

这是我的表定义

旧网络

user_id | network_id | network_url
2         3            /whatever/something.html

新网络(理想结果)

 user_id | network_id | network_url
 2         3           www.sitename3.com/whatever/something.html

网络

network_id |  network_prefix
1             www.sitename1.com
2             www.sitename2.com
3             www.sitename3.com

所以,这里发生的事情是我正在使用 network_id 的查找表,并将 network_prefix 添加到 [network_url]。如果 old_network.network_url 不包含前缀,我需要将它添加到 new_network.network_url 的开头。

移动原始数据是很容易的部分,但我不知道如何验证并在必要时添加字符串。以下是逻辑的概要:

INSERT INTO dbo.new_network (user_id,network_id,network_url)
SELECT user_id,network_id,network_url FROM old_network    


if old_network.network_id = 1 and network_url like 'www.sitename1.com%'
move it
else
set network_url = 'www.sitename1.com' + network_url

dbo.network 中的其他网络以此类推

输入这个并查看它让我有点了解,但我需要声明一个临时表吗?使用参数?任何想法表示赞赏。 使用 mssql 2008

【问题讨论】:

  • 为什么不先修改数据再插入?

标签: sql sql-server sql-server-2008 insert-into


【解决方案1】:

您可以使用CASE 和常规JOIN 来做出决定并插入正确的值。如果我正确理解您的问题,应该这样做;

INSERT INTO new_network (user_id,network_id,network_url)
 SELECT u.user_id, u.network_id, 
   CASE WHEN u.network_url LIKE s.network_prefix+'%' 
        THEN u.network_url
        ELSE s.network_prefix + '/' + u.network_url END
 FROM url_table u
 JOIN network_table s
 ON u.network_id=s.network_id;

An SQLfiddle to test with.

【讨论】:

  • 我什至没有考虑过使用 case 语句,这肯定能胜任。感谢您花时间制作小提琴。
【解决方案2】:

您只需要case 声明吗?

INSERT INTO dbo.new_network(user_id, network_id, network_url)
    SELECT user_id, network_id,
           (case when old_network.network_id = 1 and old_network.network_url like 'www.sitename1.com%'
                 then old_network.network_url
                 else 'www.sitename1.com' + old_network.network_url
    FROM old_network; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    相关资源
    最近更新 更多