sql - 从存在和不存在搜索字符串的字符串中检索特定文本
问题描述
我有以下代码。它返回前两个测试字符串的正确结果,它应该返回两个 **** 之间的文本。
第三个字符串返回“abcd 二二 ****”而不是“abcd 二二”。第四个字符串返回“传递给 LEFT 或 SUBSTRING 函数的长度参数无效。”
有任何想法吗?
WITH yourTable AS (
SELECT '**** mary had a little lamb****' AS TestString UNION ALL
SELECT '**** humpy dumpty had a great fall**** All the king''s horses and all the king''s men' UNION ALL
SELECT 'bla **** abcd two two **** dfdfdfd' UNION ALL
SELECT 'test'
)
SELECT
TestString,
SUBSTRING(TestString,
CHARINDEX('****', TestString) + 4,
CHARINDEX('****', TestString, CHARINDEX('****', TestString) + 1) - 5) AS contents
FROM yourTable;
解决方案
您可以使用PATINDEX()
andCHARINDEX()
如下:
WITH yourTable AS (
SELECT '**** mary had a little lamb****' AS TestString UNION ALL
SELECT '**** humpy dumpty had a great fall**** All the king''s horses and all the king''s men' UNION ALL
SELECT 'bla **** abcd two two **** dfdfdfd' UNION ALL
SELECT 'test'
)
SELECT TestString, SUBSTRING(TestString, T.PIX, NULLIF(TT.CIX, 0) - T.PIX)
FROM YourTable YT CROSS APPLY
(
VALUES
(
PATINDEX('%****%', TestString) + 5
)
) T(PIX) CROSS APPLY
(
VALUES
(
CHARINDEX('*', TestString, T.PIX)
)
) TT(CIX);
这是一个db-fiddle
推荐阅读
- python - Python:熊猫中的行到列
- angular - 删除参数时不会触发路由 paramMap
- android - 获取空值作为响应
- java - 对 ArrayList 进行排序时发生 Collections.sort() 错误
- vue.js - 如何在生成的 index.html 文件中加载 css 文件?
- r - R tinytex 执行失败,错误代码 127
- android - 无法为 org.gradle.api.Project 类型的根项目“RoomWordSample”获取未知属性“roomVersion”
- javascript - 云功能部署失败
- c# - 如何使用调试地址将 IWebDriver 附加到当前的 Web 浏览器?
- azure - 天蓝色活动目录设备管理