首页 > 解决方案 > 从存在和不存在搜索字符串的字符串中检索特定文本

问题描述

我有以下代码。它返回前两个测试字符串的正确结果,它应该返回两个 **** 之间的文本。

第三个字符串返回“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;

标签: sqlsql-server

解决方案


您可以使用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


推荐阅读