Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server修剪字符_Sql_Character_Trim - Fatal编程技术网

SQL Server修剪字符

SQL Server修剪字符,sql,character,trim,Sql,Character,Trim,我有以下字符串:“BOB*”,如何修剪*使其显示为“BOB” 我尝试了RTRIM('BOB*','*'),但没有按所说的那样工作,只需要1个参数。RRIM()LTRIM()仅删除空格重试 基本上只是用空的空间替换*而已 替换('TextWithCharacterToReplace'、'CharacterToReplace'、'CharacterToReplace with') 所以你想要 替换('BOB*'、'*'、'') 应该这样做。试试这个: 原创 select replace('BOB*'

我有以下字符串:“BOB*”,如何修剪*使其显示为“BOB”

我尝试了RTRIM('BOB*','*'),但没有按所说的那样工作,只需要1个参数。

RRIM()LTRIM()仅删除空格重试

基本上只是用空的空间替换*而已

替换('TextWithCharacterToReplace'、'CharacterToReplace'、'CharacterToReplace with')

所以你想要

替换('BOB*'、'*'、'')

应该这样做。

试试这个:

原创

select replace('BOB*','*','')
固定为精确的替代品

select replace('BOB*','BOB*','BOB')

如果您想要类似于RTRIM处理空间的行为,即“B*O*B**”将变成“B*O*B”,而不会丢失嵌入的空间,那么-

REVERSE(SUBSTRING(REVERSE('B*O*B**'), PATINDEX('%[^*]%',REVERSE('B*O*B**')), LEN('B*O*B**') - PATINDEX('%[^*]%', REVERSE('B*O*B**')) + 1))

应该这样做。

如果当值以
'*'
结尾时,您只想从值中删除单个
'*'
字符,则一个简单的大小写表达式将为您做到这一点:

SELECT CASE WHEN RIGHT(foo,1) = '*' THEN LEFT(foo,LEN(foo)-1) ELSE foo END AS foo
  FROM (SELECT 'BOB*' AS foo)
要删除所有尾随的
“*”
字符,则需要一个更复杂的表达式,使用
REVERSE
PATINDEX
LEN
LEFT
函数


注意:请小心使用REPLACE函数,因为它将替换字符串中所有出现的指定字符,而不仅仅是尾随字符。

MS SQL Server中实现Oracle的
从字符串修剪字符的另一个非常好的方法是:

  • 首先,您需要识别一个永远不会在字符串中使用的字符,例如
    ~
  • 用该字符替换所有空格
  • 将要修剪的字符
    *
    替换为空格
  • 您可以
    LTrim
    +
    RTrim
    获取的字符串
  • 将所有空格替换回经过修剪的字符
    *
  • 将所有从未使用过的字符替换回空格
例如:

REPLACE(REPLACE(LTrim(RTrim(REPLACE(REPLACE(string,' ','~'),'*',' '))),' ','*'),'~',' ')

如果要删除所有星号,那么很明显:

SELECT REPLACE('Hello*', '*', '')
但是,如果您在结尾处有多个星号,并且在整个过程中有多个星号,但只想修剪后面的星号,那么我会使用以下方法:

DECLARE @String VarChar(50) = '**H*i****'
SELECT LEFT(@String, LEN(REPLACE(@String, '*', ' ')))              --Returns: **H*i
我更新了此答案,以包括显示如何删除前导字符:

SELECT RIGHT(@String, LEN(REPLACE(REVERSE(@String), '*', ' ')))    --Returns: H*i****
LEN()有一个“功能”(看起来很像一个bug),它不计算尾随空格。

我真的很喜欢,几乎就停在那里了。它很聪明,但我有一种“几乎太聪明”的感觉,因为不知何故,您的字符串在某个点上实际上会故意在其中包含一个
~
(或任何东西)。所以这还不足以让我投入生产

我喜欢,但是
PATINDEX
调用似乎有些过分了

虽然它可能是一个,但这里有一个没有
PATINDEX

CREATE FUNCTION dbo.TRIMMIT(@stringToTrim NVARCHAR(MAX), @charToTrim NCHAR(1))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @retVal NVARCHAR(MAX)

    SET @retVal = @stringToTrim

    WHILE 1 = charindex(@charToTrim, reverse(@retVal))
        SET @retVal = SUBSTRING(@retVal,0,LEN(@retVal))

    WHILE 1 = charindex(@charToTrim, @retVal)
        SET @retVal = SUBSTRING(@retVal,2,LEN(@retVal))

    RETURN @retVal
END

--select dbo.TRIMMIT('\\trim\asdfds\\\', '\')
--trim\asdfds
返回一个
MAX
nvarchar会让我有点不舒服,但这是最灵活的方法..

怎么样。。(在本例中,删除尾随的逗号或句点)

对于变量:

-- Trim commas and full stops from end of City
WHILE RIGHT(@CITY, 1) IN (',', '.'))    
    SET @CITY = LEFT(@CITY, LEN(@CITY)-1)  
对于表值:

-- Trim commas and full stops from end of City
WHILE EXISTS (SELECT 1 FROM [sap_out_address] WHERE RIGHT([CITY], 1) IN (',', '.'))     
    UPDATE [sap_out_address]    
    SET [CITY] = LEFT([CITY], LEN([CITY])-1)  
    WHERE RIGHT([CITY], 1) IN (',', '.') 
用许多箱子装饰

--id = 100 101 102 103 104 105 106 107 108 109 110 111
select right(id,2)+1  from ordertbl -- 1 2 3 4 5 6 7 8 9 10 11  -- last     two positions are taken

select LEFT('BOB', LEN('BOB')-1) -- BO

select LEFT('BOB*',1) --B
select LEFT('BOB*',2) --BO

我使用了一种与上面的一些答案类似的方法,即使用模式匹配和反转字符串来找到第一个不可修剪的字符,然后将其切掉。不同的是,这个版本比上面的版本做的工作更少,所以应该更高效一些

  • 这将为任何指定字符创建
    RTRIM
    功能
  • 它包括一个附加步骤
    set@charToFind=case…
    以转义所选字符
  • 如果
    @charToReplace
    是右裆(
    ]
    ),则当前存在一个问题,因为似乎没有办法避免此问题


一个字符参数的解决方案:

rtrim('0000100','0')-> 选择左侧('0000100',len(rtrim(替换('0000100','0',''))

ltrim('0000100','0')->
选择右('0000100',len(替换(ltrim(替换('0000100','0',''),''))

SqlServer2017有了一种新的方法:

选择修剪(“00001900”中的“0”);->十九,

从“测试”中选择修剪(“,!”);->试验

从“BOB*”中选择修剪(“*”);-->鲍勃


不幸的是,RTRIM不支持修剪特定角色。

@teejay解决方案非常好。但下面的代码更容易理解:

declare @X nvarchar(max)='BOB *'

set @X=replace(@X,' ','^')

set @X=replace(@X,'*',' ')

set @X= ltrim(rtrim(@X))

set @X=replace(@X,'^',' ')

仅当您希望删除前导字符和尾随字符时,另一种方法是使用修剪功能。 默认情况下,删除空白,但如果指定其名称,则具有删除其他字符的权限

选择TRIM('=SPECIALS='中的'=SPECIALS=')作为结果

Result  
--------
SPECIALS
不幸的是,
LTRIM
RTRIM
的工作方式不同,它们只会删除空格,而不是指定字符,就像TRIM在指定其名称时所做的那样

参考和更多示例:


这将替换文本中的所有星号*

这将从字符串中删除最后一个字符,无论该字符是否为星号。这适用于以星号结尾的字符串的特殊情况,但不会检查是否应删除最后一个字符。它也不会修剪多个星号。原始问题没有说“如果有星号,我只想删除一个星号”或“我想删除所有星号,无论有多少个星号”。我回答了问题。它将从值中删除最后一个字符,无论该字符是特殊字符、字母或数字,它根本不是通用解决方案。如果只对
'BOB'
执行此操作,则结果将是
'BO'
,根据问题,这是无效的。
左侧('BOB*',3)
不幸的是,此方法无法修剪
]
^
(请参阅我的问题)。我写了两个小函数,在MsSql服务器上实现了
LTRIM
RTRIM
,请参见我在上面链接的同一页中的自我回答。这是可行的,但只会正确修剪值。。。两边修剪的最佳方式是什么?这很好。我改编了一个版本
declare @stringToSearch nvarchar(max) = '****this is****a  ** demo*****'
, @charToFind nvarchar(5) = '*' 

--escape @charToFind so it doesn't break our pattern matching
set @charToFind = case @charToFind 
    when ']' then '[]]' --*this does not work / can't find any info on escaping right crotchet*
    when '^' then '\^'
    --when '%' then '%' --doesn't require escaping in this context
    --when '[' then '[' --doesn't require escaping in this context
    --when '_' then '_' --doesn't require escaping in this context
    else @charToFind
end

select @stringToSearch
, left
(
    @stringToSearch
    ,1 
    + len(@stringToSearch)
    - patindex('%[^' + @charToFind  + ']%',reverse(@stringToSearch))
)
declare @X nvarchar(max)='BOB *'

set @X=replace(@X,' ','^')

set @X=replace(@X,'*',' ')

set @X= ltrim(rtrim(@X))

set @X=replace(@X,'^',' ')
Result  
--------
SPECIALS
    SELECT REPLACE('BOB*', '*', '')  
    SELECT REPLACE('B*OB*', '*', '') 
-------------------------------------
     Result : BOB
-------------------------------------