SQL Server选择字符串的一部分

时间:2017-08-31 05:11:57

标签: sql sql-server sql-server-2008

我有这样的表

Column1
-------------------------------------------------------
nn=APPLE IPod 44454,o=0006,o=TOP8,nn=USA,nn=TOP8+
nn=SAMSUNG G5 487894,o=04786,o=T418,nn=JPN,nn=TO478+

我需要更新该表并获得这样的结果

Column1                                                 Column2
---------------------------------------------------------------
nn=APPLE IPod 44454,o=0006,o=TOP8,nn=USA,nn=TOP8+        44454
nn=SAMSUNG G5 487894,o=04786,o=T418,nn=JPN,nn=TO478+    487894

我的想法是,但我不能适应第一个角色:

update tablename 
set [column2] = SUBSTRING(column1, 1, CHARINDEX(' ', column1) - 1 (column1, CHARINDEX(' ', column1) + 1, LEN(column1))

3 个答案:

答案 0 :(得分:0)

好的,给定第二个样本记录,看起来你需要的是逗号分隔字符串第一个位置中以空格分隔的字符串的最后一个元素。写自己(或找到)一个接受字符串和分隔符的字符串拆分函数,然后你的解析逻辑是:

  1. 用逗号分割字段
  2. 采取第一个元素
  3. 在空格处分割该元素
  4. 采取最后一个元素
  5. 这有意义吗?

答案 1 :(得分:0)

以下答案仅基于您实际向我们展示的两条记录。如果我们要从中推导出一条规则,那么我们可能希望提取紧接在字符串中第一个逗号之前的前一个单词(产品编号)。如果是这样,那么我们可以尝试以下逻辑:

  • 隔离逗号前的子字符串(例如nn=APPLE Ipod 44454
  • 反转该字符串(45444 dopI ELPPA=nn
  • 然后在第一个空格(45444
  • 之前获取该子字符串
  • 最后反转此子字符串以产生我们想要的产品编号(44454

考虑以下查询,通过CTE导入数据:

WITH yourTable AS (
    SELECT 'nn=APPLE IPod 44454,o=0006,o=TOP8,nn=USA,nn=TOP8+' AS column1 UNION ALL
    SELECT 'nn=SAMSUNG G5 487894,o=04786,o=T418,nn=JPN,nn=TO478+'
),
update_cte AS (
    SELECT
        column1,
        column2,
        REVERSE(
            SUBSTRING(REVERSE(SUBSTRING(column1, 1, CHARINDEX(',', column1)-1)),
            1,
            CHARINDEX(' ', REVERSE(SUBSTRING(column1, 1, CHARINDEX(',', column1)-1))) - 1)
        ) AS col2
    FROM yourTable
)

SELECT column1, col2 FROM update_cte;

<强>输出:

enter image description here

在这里演示:

Rextester

如果您想更新您的表格以引入这些column2产品ID,那么您可以非常轻松地使用上述CTE:

UPDATE update_cte
SET column2 = col2;

答案 2 :(得分:0)

此查询可以为您提供帮助。

  UPDATE tablename SET [column2] =
    SUBSTRING((LEFT(column1,CHARINDEX(',',column1)-1)), CHARINDEX(' ', column1, CHARINDEX(' ',column1) +1 ) +1 ,LEN(column1))