首页 > 解决方案 > 带有子字符串和 charindex 或所有字段的 select 子句

问题描述

我有一个具有这种结构的字符串:

433962/9263089/DC

我正在使用substringandcharindex来查找嵌入在字符串条之间的字符。这有效:

SUBSTRING(sk.skcontenedor,CHARINDEX('/',sk.skcontenedor)+1, 
CHARINDEX('/',sk.skcontenedor,CHARINDEX('/',sk.skcontenedor)+1)
-CHARINDEX('/',sk.skcontenedor)-1) as 'Substring'

我想将此代码放在SELECT子句中,如下所示:

select 
    SUBSTRING(sk.skcontenedor,CHARINDEX('/',sk.skcontenedor)+1, 
    CHARINDEX('/',sk.skcontenedor,CHARINDEX('/',sk.skcontenedor)+1)
    -CHARINDEX('/',sk.skcontenedor)-1) as 'Substring' 
from skcontenedor sk
join SKCONTENEDORDETALLE skcd (nolock) on sk.skcontenedorid=skcd.skcontenedorid
where DATEADD(dd, 0, DATEDIFF(dd, 0, skcd.SkContenedorLineaFch)) between '20200318' and '20200318'

但我看到了这个错误:

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

但是,如果我还在',*我的substring代码之后包含以显示所有其他字段,我会正确看到查询结果:

select 
    SUBSTRING(sk.skcontenedor,CHARINDEX('/',sk.skcontenedor)+1, 
    CHARINDEX('/',sk.skcontenedor,CHARINDEX('/',sk.skcontenedor)+1)
    -CHARINDEX('/',sk.skcontenedor)-1) as 'Substring'
    , * 
from skcontenedor sk
join SKCONTENEDORDETALLE skcd (nolock) on sk.skcontenedorid=skcd.skcontenedorid
where DATEADD(dd, 0, DATEDIFF(dd, 0, skcd.SkContenedorLineaFch)) between '20200318' and '20200318'
    and sk.skcontenedororigen in ('P', 'I')
    and SKContenedorDepOrigen<>'DR'

有什么区别?我在第一个示例中遗漏了什么?

标签: sqlsql-server

解决方案


你最好的选择可能是使用一个case表达式:

(case when sk.skcontenedor like '%/%/%'
      then <your logic here>
 end)

推荐阅读