在SQL Server中如何使用Case匹配字符串?

7
我正在尝试在SQL Select语句中使用CASE,以便获取结果,其中可以利用一个字符串的长度来生成另一个字符串的结果。这些是两个数据集中未匹配记录的结果,它们共享一个公共ID,但具有不同的数据源。
以下是Case语句:
Select Column1, Column2, 
Case
When Column1 = 'Something" and Len(Column2) = '35' Then Column1 = "Something Else" and substring(Column2, 1, 35)
End as Column3
From  dbo.xxx

当我运行它时,出现以下错误:

Msg 102,级别15,状态1,第5行附近有语法错误。


3
这个 SQL 没有意义。你能提供一些示例数据,并展示你期望发生什么吗? - Mark Byers
这是确切的SQL语句: 选择Data_Source,CustomerID,CASE WHEN Data_Source ='Test1' and Len(CustomerName) = '35' 然后 Data_Source ='Test2' and substring(CustomerName, 1, 35) 结束为CustomerName。 来自dbo.xx的。 - user1368436
1
数据源 客户ID 客户名称 测试 xxx xxx PLC,(伦敦 BR) 测试1 xxx xxx PLC(伦敦 BR2) - user1368436
2个回答

10

每个 WHEN 都需要有一个值,并且应该有一个 ELSE

Select Data_Source, CustomerID,
  CASE
    WHEN Data_Source = 'Test1' and Len(CustomerName) = 35 THEN 'First Value'
    WHEN Data_Source = 'Test2' THEN substring(CustomerName, 1, 35)
    ELSE 'Sorry, no match.'
    END AS CustomerName
  From dbo.xx

提醒一下: Len() 不返回字符串。

编辑: 涉及到一些评论的 SQL Server 答案可能是:

declare @DataSource as Table ( Id Int Identity, CustomerName VarChar(64) )
declare @VariantDataSource as Table ( Id Int Identity, CostumerName VarChar(64) )
insert into @DataSource ( CustomerName ) values ( 'Alice B.' ), ( 'Bob C.' ), ( 'Charles D.' )
insert into @VariantDataSource ( CostumerName ) values ( 'Blush' ), ( 'Dye' ), ( 'Pancake Base' )

select *,
  -- Output the CostumerName padded or trimmed to the same length as CustomerName.  NULLs are not handled gracefully.
  Substring( CostumerName + Replicate( '.', Len( CustomerName ) ), 1, Len( CustomerName ) ) as Clustermere,
  -- Output the CostumerName padded or trimmed to the same length as CustomerName.  NULLs in CustomerName are explicitly handled.
  case
    when CustomerName is NULL then ''
    when Len( CustomerName ) > Len( CostumerName ) then Substring( CostumerName, 1, Len( CustomerName ) )
    else Substring( CostumerName + Replicate( '.', Len( CustomerName ) ), 1, Len( CustomerName ) )
    end as 'Crustymore'
  from @DataSource as DS inner join
    @VariantDataSource as VDS on VDS.Id = DS.Id

在Transact-SQL CASE中,“ELSE”部分不是强制性的(如果这就是你所说的“应该”的意思)。 - Andriy M
@AndriyM - 这是一个“最佳实践”的建议。 - HABO
我并不想在语句中使用多个WHEN,我的意图是操作ID相似但数据源(Column1)不同的记录中的数据,以便返回相同的长度。当然,添加ELSE是很基本的,但不能分散我所要完成的任务。有人知道为什么在THEN后添加'='时会出现错误吗?或者有什么解决方案可以让我以这种方式使用WHEN。欢迎任何其他建议。 - user1368436
那么你有什么建议呢?我需要操作记录中ID相似但数据源(Column1)不同的数据,以便返回相同长度的数据。 - user1368436
问题非常简单,我正在尝试从不同的数据源中获取具有相同ID的记录,以便最终长度相同。一个数据源需要成为确定返回长度的驱动程序。因此,如果数据源“Test”的记录= 35,则我希望数据源“Test1”的记录也返回长度35。 - user1368436
显示剩余2条评论

2
Select 
    Column1, 
    Column2, 
    Case 
      When Column1 = 'Something' and Len(Column2) = 35 
      Then 'Something Else' + substring(Column2, 1, 35) 
    End as Column3 
From dbo.xxx

更新你的查询:

  1. 使用“+”进行字符串连接
  2. len()返回int类型,不需要使用''
  3. 在case when条件中删除“Column1 =”
  4. 将“”替换为''

希望这可以帮到你。


嗨Seanbun,感谢您的建议。我不打算在这里连接任何数据。长度是必需的,以便操纵数据以使返回值具有相同的长度。我正在寻找理解为什么“=”在我的THEN后引起错误或建议我如何使用WHEN来促进具有相同ID、变量数据源的记录匹配特定字段的返回长度。 - user1368436
用'否则'会有帮助吗?像下面这样,或者您可以声明一个变量@Result来存储您的值,并在最后返回?选择     列1,     列2,     案例       当Column1 ='Something'且Len(Column2)= 35       那么'Something Else'+ substring(Column2,1,35)    否则Column1     End as Column3 从dbo.xxx - seanbun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接