【问题标题】:To get the first word before the first delimiter获取第一个分隔符之前的第一个单词
【发布时间】:2019-03-22 00:02:54
【问题描述】:

我使用的是 SQL Server 2012。

我需要更新一列以仅获取第一个点之前的单词。 代码具有 nvarchar 作为数据类型。

示例 - Table_A

Id   Code
1    TXT.yut.get
2    yep.no
3    gT.YU.iop
4    gip

我需要在更新后得到这个

Id   Code
1    txt
2    yep
3    gt
4    gip

我已经尝试过使用 T-SQL:

Update table_A
SET Code=lower(SUBSTRING(Code, 1, CHARINDEX('.',Code) - 1))

我得到这个错误:

传递给 LEFT 或 SUBSTRING 函数的长度参数无效。

它似乎与“隐形”空间有关?如何克服它?谢谢。

【问题讨论】:

  • 我怀疑您的表中也有没有分隔符的值(或者它是第一个字符?)。您对 '.hi''png' 的值有何期望?
  • 是的,有些情况下没有分隔符。我在上面添加了一个示例。
  • png -> png 。 .hi 的值永远不会发生......但如果是这样:hi 将是值。

标签: sql sql-server


【解决方案1】:

包含WHERE 子句:

UPDATE table_A
     SET Code = LOWER(SUBSTRING(Code, 1, CHARINDEX('.',Code) - 1))
WHERE Code like '%.%';

【讨论】:

  • 或者LEFT(Code, CHARINDEX('.', Code) - 1)
【解决方案2】:
Update table_A
SET Code=substr(Code,1,instr(Code,'.',1)-1)
where Code like '%.%'

【讨论】:

    【解决方案3】:

    以上所有答案都将完成工作,我还将包括两种不同的方法:

    带案例

    UPDATE Table_A
    SET 
        Code = CASE WHEN CHARINDEX('.', Code) > 0 THEN LEFT(Code, CHARINDEX('.', Code) - 1) ELSE Code END
    

    还有这个Without CASE

    UPDATE Table_A
    SET 
        Code = LEFT(Code, CHARINDEX('.', Code) - 1) 
    WHERE 
        CHARINDEX('.', Code) > 0
    

    这里唯一的不同之处在于只会从每行中抓取第一个点。与 LIKE %.% 不同,它将覆盖每行上的所有点。如果没有点,CHARINDEX('.', Code) 的结果将为零。

    【讨论】:

      【解决方案4】:
      SELECT LEFT(Code, LOCATE(".", Code)-1) AS left FROM table_A
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      猜你喜欢
      • 2012-02-06
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多