поиск шаблона в T-SQL - PullRequest
       14

поиск шаблона в T-SQL

0 голосов
/ 17 августа 2010

У меня есть столбцы БД со значениями вроде 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 ]

1 голос
/ 17 августа 2010
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
1 голос
/ 17 августа 2010

Для 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.

1 голос
/ 17 августа 2010
  • Используйте REVERSE CHARINDEX, чтобы найти последнюю точку
  • Введите SUBSTRING и ОБРАТИТЕ этот бит снова, чтобы получить последний номер
  • Сохранить остаток от зарезервированной строки
  • CAST в целое число, добавить один, CAST в строку
  • Добавить остаток от зарезервированной строки и вновь увеличенное число
  • REVERSE

или сохраните его правильно

  • Вы также можете использовать вложенный CHARINDEX + 1, чтобы найти третью точку без REVERSE

или правильно хранить

  • Сделайте это в коде клиента или CLR, который имеет удобную функцию string.split

или стор ... вы поняли

0 голосов
/ 17 августа 2010

лучший способ:

создайте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...