2011-02-24 10 views
4

У меня есть поле данных, который состоит из номера счета, как этогоSQL Server, используя условие в подстроках

16530907-00 
16530907-0001 

16589553-00 
16589553-00 

Я хочу, чтобы выбрать все справа от дефиса тогда, если длина этой подстроки > 2 Я хочу обновить это поле и установить его для себя минус две лишние цифры справа.

Я практикую с отборным заявлением

Select SUBSTRING(Account, CHARINDEX('-'), Account)+1, LEN(Account) as test 
FROM Documents 
WHERE SubmissionID=45925 and LEN(test)>2 

Это не работает. Я действительно хочу создать инструкцию обновления, которая проверяет символы справа от дефиса, если их более двух символов, а затем усекайте любые дополнительные символы.

Любые предложения будут оценены. Благодаря

+0

Мне нужно, чтобы узнать, как пишется символ – cloud311

+0

Вы можете редактировать свой вопрос. Кроме того, почему бы не опубликовать пример ввода и вывода, который вы ожидаете; то, что вы описываете, не очень понятно. –

+0

Какую версию SQL Server вы используете? Некоторые из предлагаемых решений будут работать только с 2005 года или выше. –

ответ

2

Спасибо всем за комментарии и предложения. Я использовал некоторые из того, что было здесь, чтобы придумать решение, которое, как я думаю, будет хорошо работать для меня. Вот.

Update Documents 
Set Acount=LEFT(Account,Len(Account)-2) 
WHERE Submid=41632 AND Account LIKE '%-____' 

(Благодаря @Richard для этого последнего бита!)

+0

Я вижу, что вы новичок здесь (новый родственник). Замечательно видеть ваш окончательный ответ! Обычно мы также отмечаем ответ, чтобы принять его, и это вроде как «закрывает» вопрос. – RichardTheKiwi

2

Попробуйте это:

Select SUBSTRING(Account,0,CHARINDEX('-',Account)+3) as UpdatedAccount, Account 
FROM Documents 
WHERE SubmissionID=45925 
and LEN(SUBSTRING(Account, CHARINDEX('-',Account)+1,LEN(Account))) > 2 
AND CHARINDEX('-',Account) > 0 

Это некрасиво, но, похоже делать, что вы хотите

Ваше обновление будет выглядеть следующим образом:

UPDATE Documents 
SET Account = SUBSTRING(Account,0,CHARINDEX('-',Account)+3) 
WHERE SubmissionID=45925 
and LEN(SUBSTRING(Account, CHARINDEX('-',Account)+1,LEN(Account))) > 2 
AND CHARINDEX('-',Account) > 0 

UPDATE:

Добавлено в чек не для сценариев дефиса, так что вы не дадите сын. Тем не менее, я бы рекомендовал пойти с решением @Richards. Это намного красивее.

+0

@Abe - 'LEN (SUBSTRING (учетная запись, CHARINDEX ('-', Account) + 1, LEN (Account)))> 2' returns {true }, когда нет дефиса – RichardTheKiwi

+0

Черт вас и ваши испытания !!! Stand by ... –

+0

@ Когда вы его тестируете, OP хочет ХРАНИТЬ 2 символа после тире, а не удалить все. Ты делаешь лучше меня с +2 – RichardTheKiwi

2

Если вы используете SQL Server 2005 или больше, вы можете использовать Common Table Expression.

WITH CTE 
AS 
    (
    SELECT Account 
     , CHARINDEX('-', Account) AS [Dash Index] 
     , CASE 
      WHEN CHARINDEX('-', Account)+2 > 2 
       THEN CHARINDEX('-', Account)+2 
      ELSE LEN(Account) 
      END AS [Acceptable Length] 
     , LEN(Account) AS [Total Length] 
    FROM Documents 
    ) 
UPDATE CTE 
SET Account = SUBSTRING(Account, 1, [Acceptable Length]) 
WHERE [Total Length] <> [Acceptable Length] 
+0

Хорошее решение. Мне было бы интересно посмотреть, как производительность сравнивается между этим и моим. –

+0

@Abe - несравненный. Это не работает (синтаксическая ошибка). – RichardTheKiwi

+0

Речь идет только об изменении 'SUBSTRING (Account, CHARINDEX ('-', Account) +1)' to 'SUBSTRING (Account, CHARINDEX ('-', Account) +1, 1000)'? –

2
UPDATE Documents 
SET Account = STUFF(Account, CharIndex('-', Account)+3, 1000, '') 
where SubmissionID=45925 AND Account like '%-___%' 
+0

@Abe Должен иметь дефис и более 2, иначе мы не будем над ним работать. Окончание% - это выбор тропы любой длины. – RichardTheKiwi

+0

. Ах, вы правы, я думал, что по какой-то причине нужно быть наоборот. –

+0

@ Abe, @ Ричард благодарю вас обоих за ваши предложения, я попробую оба метода. – cloud311

Смежные вопросы