Проблема синтаксиса T-SQL с «LTRIM (RTRIM ())» работает неправильно - PullRequest
1 голос
/ 06 августа 2010

Что не так с этим утверждением, что оно все еще дает мне пробелы после поля.Это заставляет меня думать, что синтаксис, объединяющий операторы WHEN, отключен.Мой босс хочет, чтобы они были объединены в одном утверждении.Что я делаю не так?

Case WHEN LTRIM(RTRIM(cSHortName))= '' Then NULL 
     WHEN cShortname is NOT NULL THEN 
       REPLACE (cShortName,SUBSTRING,(cShortName,PATINDEX('%A-Za-z0-9""},1,) ''_ 
end AS SHORT_NAME

Ответы [ 4 ]

1 голос
/ 06 августа 2010

Судя по коду, возможно, вы пытаетесь убрать пробелы и не алфавитно-цифровые символы в начале и конце строки.

Если это так, будет ли это работать для вас? Я думаю, что это обеспечивает подстроку от первого алфавитно-цифрового вхождения до последнего.

SELECT
SUBSTRING(
 cShortName,
 PATINDEX('%A-Za-z0-9',cShortName),
  ( LEN(cShortName)
   -PATINDEX('%A-Za-z0-9',REVERSE(cShortName))
   -PATINDEX('%A-Za-z0-9',cShortName)
  )
) AS SHORTNAME
0 голосов
/ 06 августа 2010

Заменить TRIM на LTRIM.

Вы также можете проверить LEN(cShortName) = 0

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

Ммм, похоже, в этом скрипте есть некоторые проблемы, но попробуйте это.

Case 
     WHEN LTRIM(RTRIM(cSHortName))= '' Then NULL
     WHEN cShortname is NOT NULL THEN REPLACE(cShortName, SUBSTRING(cShortName, PATINDEX('%A-Za-z0-9', 1) , ''), '') 
end AS SHORT_NAME
0 голосов
/ 06 августа 2010

Почему вы думаете, что после поля не должно быть пробелов?

Edit:

Насколько я понимаю, вы пытаетесь удалить любые символы из строки, которые не соответствуют этому диапазону регулярных выражений [a-zA-Z0-9] (добавить любые другие символы, которые вы хотите сохранить).

Я не вижу чистого способа сделать это в Microsoft SQL Server (кажется, вы используете Microsoft SQL Server), используя встроенные функции. В Интернете есть несколько примеров, которые используют временную таблицу и цикл while, но это ужасно. Я бы либо возвратил строки как есть и обработал их на стороне вызывающей стороны, либо написал бы функцию, которая делает это, используя CLR и вызвал бы ее из оператора select.

Надеюсь, это поможет.

...