【问题标题】:How can you add a column to your SQL Server table based on the contents of another column?如何根据另一列的内容向 SQL Server 表中添加一列?
【发布时间】:2012-05-23 16:06:51
【问题描述】:

我有两张表,其中包含以下信息:

产品

Name  |    ID   |   

Name 包含一个短字符串,指示行的名称和语言。

语言

Language   |   ID   |

语言将是上面名称列中包含的相同子字符串。

我想做的是在我的 Products 表中添加一个名为 LanguageID 的列。

然后,我将从 Name 列中提取指示语言的子字符串,并与 Languages 表中的 Language 列进行不区分大小写的比较。在找到匹配项的地方,我想将 Languages 表中的 ID 值插入到新创建的 LanguageID 列中,从而创建外键关系。

所以,例如在我的产品表中,我有:

Name                  |   ID
Product 1 - enGlIsh   |   1

在我的语言表中,我有:

Language    |   ID
English     |   77

所以我希望在 Products 表中得到的结果是:

Name                   |   ID   |   LanguageID
Product 1 - enGlIsh    |   1    |    77

我已经编写了一个正则表达式来从我的子字符串中返回语言,但是我不确定如何使用它并在 SQL 服务器中构造这个查询。我该怎么做?

这是正则表达式:

Regex regEx = new Regex(@"(.+\s*-\s*.+\s*-\s*.+)\s*-\s*(\w{1,3}\s*-\s*\w{1,3})\s*-\s*.+");
                string language = regEx.Match(   NAME   ).Groups[2].Value.ToString(); 

【问题讨论】:

    标签: sql-server regex database sql-server-2008 stored-procedures


    【解决方案1】:

    不需要正则表达式;

    create table Languages(id int identity(1,1), language varchar(32) )
    

    获取语言列表(假设格式为<anything><space><language_name>):

    insert Languages
        select distinct 
           right(name,charindex(' ', reverse(name), 1)-1) as [language]
        from products
    

    然后您可以返回并根据需要使用相同的表达式进行替换/更新以获取语言名称。

    【讨论】:

      【解决方案2】:

      你真的不需要正则表达式,只需在字符串上使用上面的命令,然后查看产品名称是否包含语言。像这样的

      insert my_product_lang_table
      select p.name, p.id, l.id
      from product p, language l
      where charindex(upper(l.name),upper(p.name)) != null 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-18
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 2020-04-28
        • 2022-10-23
        • 2011-09-22
        相关资源
        最近更新 更多