【问题标题】:Set Values in column B based on values in Column A in SQL2005?根据 SQL2005 中 A 列中的值设置 B 列中的值?
【发布时间】:2011-03-03 20:03:13
【问题描述】:

我正在尝试获取现有列并解析字符串中某些单词的每一行,即工作表、页面、卡片,并基于该单词(这些单词中只有一个实例在一行中)填充同一个表中的新列具有值。如果没有找到任何这些词,请将 B 列留空。

I.E. A列包含单词“Sheet”,用字母“S”填充B列

所以表格应该是这样的:

Column A  Column B
Sheet        S
Page         P
Card         C

任何帮助将不胜感激!

【问题讨论】:

    标签: sql sql-server-2005 etl


    【解决方案1】:
    UPDATE YourTable
        SET ColumnB = CASE WHEN ColumnA LIKE '%Sheet%' THEN 'S'
                           WHEN ColumnA LIKE '%Page%' THEN 'P'
                           WHEN ColumnA LIKE '%Card%' THEN 'C'
                           ELSE NULL /* or '' if you prefer */
                      END
    

    【讨论】:

      【解决方案2】:
      ;WITH mappings (ColumnA, ColumnB) AS
      (
       SELECT 'Sheet','S' UNION ALL
       SELECT 'Page','P' UNION ALL
       SELECT 'Card','C' 
      )
      UPDATE y
      SET y.ColumnB= m.ColumnB
      FROM YourTable y
      JOIN mappings m ON y.ColumnA LIKE '%' + m.ColumnA + '%'
      

      【讨论】:

      • 可能是边缘情况,但如果 ColumnB 先前包含不再有效的值,这不会将其清空。
      • @Joe - 这不在规范中!该问题说“将 B 列留空”,这意味着它当前不包含任何非空白项。
      • 你是对的,正如我所说,它充其量只是一个需要考虑的边缘情况。
      • 感谢您的回答,我尝试了两种方法,并且在我的情况下都运行良好,但是如果将来有人发现这个问题,我会检查 Joe 的答案。
      【解决方案3】:
      update myTable 
      set columnB = substring(columnA, 1, 1) 
      

      【讨论】:

      • 如果您希望它始终为大写,您可以将子字符串部分更改为:upper(substring(columnA, 1, 1))
      • 它没有解决问题,他只想要工作表、页面、卡片值,否则为空。这只是从 A 到 B 的第一个字符。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 2022-01-03
      • 1970-01-01
      • 2021-04-05
      • 2019-11-13
      • 1970-01-01
      • 2015-05-12
      相关资源
      最近更新 更多