在t-sql中搜索模式

时间:2010-08-17 15:34:15

标签: sql-server-2005 tsql

我有一个db列,其值为100.23.24.1,100.23.24.2,100.23.24.3等。我必须找到最后一个点之后的最后一个数字。在这种情况下,我想要3.然后我想增加最后一个数字并生成新条目为100.23.24.4。我怎样才能做到这一点。有人可以帮忙吗?

我找不到100.23.24。模式,因为这可能会在另一个数据库列中更改,如:100.23.25.1,100.23.25.2。在这种情况下,我应该得到最后一个数字为2

4 个答案:

答案 0 :(得分:1)

  • 使用REVERSE和CHARINDEX查找最后一个点
  • 再次输入SUBSTRING并反转此位以获取最后一个数字
  • 保留剩余的保留字符串
  • CAST为整数,添加一个,CAST为字符串
  • 追加保留字符串的剩余部分和新增加的数字
  • REVERSE

或正确存储

  • 您还可以使用嵌套的CHARINDEX + 1来查找没有REVERSE
  • 的第3个点

或正确存储

  • 在客户端或CLR代码中执行此操作,该代码具有方便的string.split功能

或stor ...你明白了

答案 1 :(得分:1)

对于SQL Server,下面的查询向您展示了如何提取左侧和右侧部分以构建新值:

DECLARE @ip varchar(20)
SET @ip = '100.23.24.1'

SELECT left(@ip, len(@ip) - charindex('.', reverse(@ip))) + '.' + 
  cast(right(@ip, charindex('.', reverse(@ip)) - 1) + 1 as varchar(3))

在这种情况下,它将返回100.23.24.2。

答案 2 :(得分:1)

WITH ips AS
(
SELECT '100.23.24.123' AS ip UNION ALL
SELECT '100.23.24.1' AS ip
)


SELECT LEFT(ip, PATINDEX('%' + PARSENAME(ip,1),ip) -1) + 
              CAST(CAST(PARSENAME(ip,1) AS INT)+1 AS VARCHAR)
FROM ips

答案 3 :(得分:0)

最佳方式:

创建4个微小或小的int值的新列,然后从字符串列填充它们。此时删除字符串列。您现在可以轻松地执行:

UPDATE YourTable Set col4=col4+1 WHERE col4=3

如果您愿意,可以添加计算列以将4个值连接回字符串,以支持旧代码。

--set up existing table
create table YourTable (YourColumn varchar(20))
INSERT YourTable VALUES ('100.23.24.1')
INSERT YourTable VALUES ('100.23.24.2')
INSERT YourTable VALUES ('100.23.24.3')
INSERT YourTable VALUES ('100.23.24.9')

--add in new columns
ALTER TABLE YourTable ADD  Col1 int null
ALTER TABLE YourTable ADD  Col2 int null
ALTER TABLE YourTable ADD  Col3 int null
ALTER TABLE YourTable ADD  Col4 int null

--populate the new columns, split apart the string
UPDATE YourTable
    SET Col1=PARSENAME(YourColumn,4)
       ,Col2=PARSENAME(YourColumn,3)
       ,Col3=PARSENAME(YourColumn,2)
       ,Col4=PARSENAME(YourColumn,1)

--remove the string column
ALTER TABLE YourTable drop column YourColumn

--add back the string column as a computed column
ALTER TABLE dbo.YourTable ADD YourColumn  AS CONVERT(varchar(10),Col1)+'.'+CONVERT(varchar(10),Col2)+'.'+CONVERT(varchar(10),Col3)+'.'+CONVERT(varchar(10),Col4)

--show the table's contents
select * from YourTable

输出:

Col1        Col2        Col3        Col4        YourColumn
----------- ----------- ----------- ----------- -------------
100         23          24          1           100.23.24.1
100         23          24          2           100.23.24.2
100         23          24          3           100.23.24.3
100         23          24          9           100.23.24.9

(4 row(s) affected)

这是一个快速暴力表扫描方式:

UPDATE YourTable
    SET YourColumn=LEFT(YourColumn,LEN(YourColumn)-2)+'.4'
    WHERE LEFT(REVERSE(YourColumn),2)='3.'

示例代码:

declare @YourTable table (YourColumn varchar(20))
INSERT @YourTable VALUES ('100.23.24.1')
INSERT @YourTable VALUES ('100.23.24.2')
INSERT @YourTable VALUES ('100.23.24.3')
INSERT @YourTable VALUES ('100.23.24.9')


UPDATE @YourTable
    SET YourColumn=LEFT(YourColumn,LEN(YourColumn)-2)+'.4'
    WHERE LEFT(REVERSE(YourColumn),2)='3.'

select * from @YourTable

输出:

YourColumn
--------------------
100.23.24.1
100.23.24.2
100.23.24.4
100.23.24.9