it-swarm-id.com

Karakter SQL Server TRIM

Saya memiliki string berikut: 'BOB *', bagaimana saya memotong * sehingga muncul sebagai 'BOB'

Saya mencoba RTRIM ('BOB *', '*') tetapi tidak berfungsi karena hanya membutuhkan 1 parameter.

12
Nate Pet
LEFT('BOB*', LEN('BOB*')-1)

harus melakukannya.

2
paulmorriss

Cara lain yang cukup bagus untuk mengimplementasikan TRIM char FROM string Oracle di MS SQL Server adalah sebagai berikut:

  • Pertama, Anda perlu mengidentifikasi char yang tidak akan pernah digunakan dalam string Anda, misalnya ~
  • Anda mengganti semua spasi dengan karakter itu
  • Anda mengganti karakter * yang ingin Anda pangkas dengan spasi
  • Anda LTrim + RTrim string yang diperoleh
  • Anda mengganti kembali semua spasi dengan karakter yang dipangkas *
  • Anda mengganti kembali semua karakter yang tidak pernah digunakan dengan spasi

Sebagai contoh:

REPLACE(REPLACE(LTrim(RTrim(REPLACE(REPLACE(string,' ','~'),'*',' '))),' ','*'),'~',' ')
20
Teejay
CREATE FUNCTION dbo.TrimCharacter
(
    @Value NVARCHAR(4000),
    @CharacterToTrim NVARCHAR(1)
)
RETURNS NVARCHAR(4000)
AS
BEGIN
    SET @Value = LTRIM(RTRIM(@Value))
    SET @Value = REVERSE(SUBSTRING(@Value, PATINDEX('%[^'[email protected]+']%', @Value), LEN(@Value)))
    SET @Value = REVERSE(SUBSTRING(@Value, PATINDEX('%[^'[email protected]+']%', @Value), LEN(@Value)))
    RETURN @Value
END
GO
--- Example
----- SELECT dbo.TrimCharacter('***BOB*********', '*')
----- returns 'BOB'
15
Chris Rodriguez

Jika Anda ingin menghapus semua tanda bintang maka jelas:

SELECT REPLACE('Hello*', '*', '')

Namun , Jika Anda memiliki lebih dari satu tanda bintang di akhir dan beberapa di antaranya, tetapi hanya tertarik untuk memangkas tanda bintang, maka saya akan menggunakan ini:

DECLARE @String VarChar(50) = '**H*i****'
SELECT LEFT(@String, LEN(REPLACE(@String, '*', ' ')))              --Returns: **H*i

Saya memperbarui jawaban ini untuk menyertakan menunjukkan cara menghapus karakter utama:

SELECT RIGHT(@String, LEN(REPLACE(REVERSE(@String), '*', ' ')))    --Returns: H*i****

LEN () memiliki "fitur" (yang sangat mirip bug) di mana ia tidak menghitung spasi tambahan.

9
MikeTeeVee

Jika Anda hanya ingin menghapus satu karakter '*' dari nilai ketika nilai berakhir dengan '*', ekspresi CASE sederhana akan melakukannya untuk Anda:

SELECT CASE WHEN RIGHT(foo,1) = '*' THEN LEFT(foo,LEN(foo)-1) ELSE foo END AS foo
  FROM (SELECT 'BOB*' AS foo)

Untuk menghapus semua karakter trailing '*', maka Anda memerlukan ekspresi yang lebih kompleks, memanfaatkan fungsi REVERSE, PATINDEX, LEN dan LEFT.

CATATAN: Hati-hati dengan fungsi REPLACE, karena itu akan menggantikan semua kemunculan karakter yang ditentukan dalam string, bukan hanya yang tertinggal.

4
spencer7593

Jika Anda menginginkan perilaku yang mirip dengan cara RTRIM menangani spasi mis. Bahwa "B * O * B **" akan berubah menjadi "B * O * B" tanpa kehilangan yang tertanam maka sesuatu seperti -

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

Harus melakukannya.

4
George

Bagaimana dengan .. (dalam hal ini untuk memangkas koma atau titik)

Untuk variabel:

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

Untuk nilai tabel:

-- 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 (',', '.') 
2
Simon L

RRIM () LTRIM () hanya menghapus spasi coba http://msdn.Microsoft.com/en-us/library/ms186862.aspx

Pada dasarnya ganti saja * dengan ruang kosong 

REPLACE ('TextWithCharacterToReplace', 'CharacterToReplace', 'CharacterToReplaceWith')

Jadi kamu mau

REPLACE ('BOB *', '*', '')

2
Purplegoldfish

Solusi untuk satu parameter char:

rtrim ('0000100', '0') -> pilih kiri ('0000100', len (rtrim (ganti ('0000100', '0', ''))))

ltrim ('0000100', '0') -> pilih kanan ('0000100', len (ganti (ltrim (ganti ('0000100', '0', '')), '', '.') ))

0
MilanKrsiak

Potong dengan banyak kasing

--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
0
Arun Prasad E S

Coba ini:

Asli

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

Tetap menjadi pengganti yang tepat

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

Solusi @teejay sangat bagus. Tetapi kode di bawah ini bisa lebih dimengerti:

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

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

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

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

set @X=replace(@X,'^',' ')
0
CAGDAS AYDIN

Saya telah menggunakan pendekatan yang mirip dengan beberapa jawaban di atas menggunakan pencocokan pola dan membalikkan string untuk menemukan karakter pertama yang tidak dapat dipangkas, kemudian memotongnya. Perbedaannya adalah versi ini bekerja lebih sedikit daripada yang di atas, jadi harus sedikit lebih efisien.

  • Ini menciptakan fungsionalitas RTRIM untuk setiap karakter yang ditentukan.
  • Ini termasuk langkah tambahan set @charToFind = case... untuk menghindari karakter yang dipilih.
  • Saat ini ada masalah jika @charToReplace adalah selangkangan yang benar (]) karena tampaknya tidak ada cara untuk menghindari ini.

.

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))
)
0
JohnLBevan

SqlServer2017 memiliki cara baru untuk melakukannya: https://docs.Microsoft.com/en-us/sql/t-sql/functions/trim-transact-sql?view=sql-server-2017

SELECT TRIM ('0' FROM '00001900'); -> 19

SELECT TRIM ('.,!' FROM '# test.'); -> # tes

SELECT TRIM ('*' DARI 'BOB *'); -> BOB

Sayangnya, RTRIM tidak mendukung pemangkasan karakter tertentu.

0
Sergei Zinovyev

Saya sangat suka jawaban Teejay , dan hampir berhenti di sana. Ini pintar, tapi saya merasa "hampir terlalu pintar", karena, entah bagaimana, string Anda pada suatu saat akan benar-benar memiliki ~ (atau apa pun) dengan sengaja. Jadi itu tidak cukup defensif bagi saya untuk dimasukkan ke dalam produksi.

Saya suka Chris 'juga , tetapi panggilan PATINDEX sepertinya berlebihan. 

Meskipun ini mungkin optimasi mikro , ini dia tanpa 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

Mengembalikan MAX nvarchar sedikit mengganggu saya, tapi itu cara paling fleksibel untuk melakukan ini ..

0
ruffin