sql - 带有子字符串和 charindex 或所有字段的 select 子句
问题描述
我有一个具有这种结构的字符串:
433962/9263089/DC
我正在使用substring
andcharindex
来查找嵌入在字符串条之间的字符。这有效:
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'
有什么区别?我在第一个示例中遗漏了什么?
解决方案
你最好的选择可能是使用一个case
表达式:
(case when sk.skcontenedor like '%/%/%'
then <your logic here>
end)
推荐阅读
- python - 需要很好地解释这个小 Python 代码
- postgresql - 使用 JPA Criteria 复制 PostgreSQL select distinct on + multiple order by 条件
- sockets - Dart客户端Socket连接但不向服务器发送数据?
- javascript - 如何在javascript的循环中更改对象的项目值?
- javascript - 反应.js | 如果我将 setState 作为回调函数传递,则无限渲染,即使在解构道具之后也是如此
- javascript - 过滤不同类别并返回多个条目
- glibc - RHEL 6 - 安装了 'GLIBC_2.14' 但仍然是 Yum 错误
- r - 在R中按月和年选择数据
- php - 尝试获取客户订单时得到空结果 Shopify admin api
- java - 如何从命令行启动 JavaFX 源代码文件?