【问题标题】:SQL - Selecting portion of a stringSQL - 选择字符串的一部分
【发布时间】:2010-02-25 23:25:01
【问题描述】:

如果我有一个简单的表,其中数据的行包含如下字符串:

/abc/123/gyh/tgf/345/6yh/5er

在 SQL 中,如何选择第 5 和第 6 个斜线之间的数据?我拥有的每一行都是正斜杠内的简单数据,我只想选择斜杠 5 和 6 之间的所有字符。

【问题讨论】:

  • 您使用的是哪个数据库?
  • 如果可能,您可能需要重新考虑您的数据库设计并为您的数据单元使用单独的字段而不是字符串分隔符。
  • Heinzi - 这就是我们正在尝试做的事情 =) 这是一些遗留数据,我们正在尝试将它们动态解析到单独的字段中

标签: sql regex sql-server-2005 string


【解决方案1】:

CLR 函数在处理字符串方面比 T-SQL 更有效。以下是一些帮助您开始编写 CLR 用户定义函数的信息。

我认为您应该创建具有 3 个参数的函数:

  1. 您正在搜索的值
  2. 分隔符(在您的情况下为:/)
  3. 您正在寻找的实例(在您的情况下:5)

然后你在分隔符上拆分(成一个数组)。然后返回数组中的第 5 项(索引 4)


这里是t-sql方案,但我真的相信CLR方案会更好。

DECLARE @RRR varchar(500)
SELECT @RRR = '/abc/123/gyh/tgf/345/6yh/5er'


DECLARE
    @index INT,
    @INSTANCES INT

SELECT
    @index = 1,
    @INSTANCES = 5

WHILE (@INSTANCES > 1) BEGIN
    SELECT @index = CHARINDEX('/', @RRR, @index + 1)
    SET @INSTANCES = @INSTANCES - 1
END

SELECT SUBSTRING(@RRR, @index + 1, CHARINDEX('/', @RRR, @index + 1) - @index - 1)

【讨论】:

    【解决方案2】:
    SELECT SUBSTRING(myfield,
    
      /* 5-th slash */
      CHARINDEX('/', myfield,
        CHARINDEX('/', myfield,
          CHARINDEX('/', myfield,
            CHARINDEX('/', myfield,
              CHARINDEX('/', myfield) + 1) + 1) + 1) + 1)
      + 1,
    
      /* 6-th slash */          
      CHARINDEX('/', myfield,
        CHARINDEX('/', myfield,
          CHARINDEX('/', myfield,
            CHARINDEX('/', myfield,
              CHARINDEX('/', myfield,
                CHARINDEX('/', myfield) + 1) + 1) + 1) + 1) + 1)
      -
      /* 5-th slash again */
      CHARINDEX('/', myfield,
        CHARINDEX('/', myfield,
          CHARINDEX('/', myfield,
            CHARINDEX('/', myfield,
              CHARINDEX('/', myfield) + 1) + 1) + 1) + 1)
      - 1)
    
    FROM myTable
    WHERE ...
    

    这可行,但远非优雅。如果可能,选择完整的字段并在客户端过滤掉所需的值(使用比 T-SQL 更强大的编程语言)。正如你所看到的,T-SQL 并不是为做这类事情而设计的。

    (编辑:我知道以下内容不适用于您的情况,但我会将其作为对阅读此内容的其他人的建议:)

    事实上,关系数据库根本不适合使用字符串分隔的值列表,因此更好的解决方案是将该字段拆分为表中的单独字段(或拆分为子表,如果条目不同)。

    【讨论】:

      【解决方案3】:

      也许...SELECT FROM `table` WHERE `field` LIKE '%/345/%'

      【讨论】:

      • 那会选择包含 345 的集合,但我想他想解析出数据。
      • 是的,这行不通,因为它并不总是 345。我想得到第 5 和第 6 个斜线之间的任何东西,不管那里有什么。
      • 好吧,选择 LIKE '/%/%/%/%/%/%/%' 并使用服务器端脚本来拆分它? xD
      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多