更新SUBSTRING QUERY

时间:2017-10-06 13:18:23

标签: sql sql-server

挣扎着以下。 下面是我运行以下查询时的屏幕截图 -

select [Journal Source], [File], filepath from xIntegration..FinanceIntegration WHERE FilePath like '%rent debit%'

enter image description here

我要做的是使用字段File的_(下划线)之前的第一个数字更新Journal Source。

当我运行以下代码时,它将所有行的Journal Source设置为9,而不仅仅是我期望的位置。

我希望前4行会变为8,剩下的变化会变为9。

--UPDATE THE BATCH NUMBER (Journal Source) For Rent Debit File
DECLARE @filenameRentDebit as varchar(100)
SELECT @filenameRentDebit =  [File] FROM FinanceIntegration WHERE FilePath like '%rent debit%'

DECLARE @indexRentDebit INT 
set @indexRentDebit = CHARINDEX('_', @filenameRentDebit)

UPDATE FinanceIntegration
SET [Journal Source] = SUBSTRING(@filenameRentDebit, 0, @indexRentDebit) 
WHERE FilePath like '%rent debit%'

我犯了什么愚蠢的错误?感谢

2 个答案:

答案 0 :(得分:2)

正确的想法,除了使用变量。你想要:

UPDATE FinanceIntegration
    SET [Journal Source] = SUBSTRING([File], 0, CHARINDEX('_', [File])) 
    WHERE FilePath like '%rent debit%';

变量具有单个值,来自表的任意行。

答案 1 :(得分:0)

我会使用SUBSTRINGCHARINDEXCAST的组合进行更新:

UPDATE xIntegration..FinanceIntegration
SET [Journal Source] = CAST(SUBSTRING([File], 1, CHARINDEX('_', [File]) - 1) as INT)
WHERE FilePath like '%rent debit%'

说明:

  • CHARINDEX('_', [File])找到第一个下划线字符的索引。
  • SUBSTRING([FILE], 1, CHARINDEX(...) - 1)削减了正确的部分
  • 可选地,如果INT [Journal Source] INT,则可能需要将其强制转换为#legacySQL SELECT DATE, SUM(totals.visits) AS sessions, fullVisitorId, MAX(CASE WHEN hits.customdimensions.index = 3 THEN hits.customdimensions.value END) dogs FROM [project:dataset.table] WHERE REGEXP_MATCH(hits.customdimensions.value, r'^[0-9]') GROUP BY DATE, fullVisitorId ORDER BY dogs DESC