SQL - 选择字符串的一部分

时间:2010-02-25 23:25:02

标签: sql regex sql-server-2005 string

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

  1. 您正在搜索的值
  2. 分隔符(在您的情况下:/)
  3. 您正在寻找的实例(在您的情况下:5)
  4. 然后拆分分隔符(进入数组)。然后返回数组中的第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)
    

答案 1 :(得分:1)

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并不是为了做这种事情而设计的。

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

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

答案 2 :(得分:0)

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