我想使用 SQL 從字串值中洗掉連字符。
我有一列包含以下資料:
middle-to high-income parents
Assets -
business – 1 year in their Certified program
explain your assets
10-12-15 years -
這就是我需要的那些字串:
middle-to high-income parents
Assets
business – 1 year in their Certified program
explain your assets
10-12-15 years
我試過了
rtrim(ltrim(replace(bal_sheet_item, '-', ' ')))
但它洗掉了所有連字符,而不僅僅是字串末尾的連字符。
uj5u.com熱心網友回復:
您可以通過一些技巧來完成此操作,但是為什么不讓您的表示層洗掉任何尾隨破折號呢?
SELECT bal_sheet_item = LEFT(bal_sheet_item, LEN(bal_sheet_item)
- CASE WHEN RIGHT(bal_sheet_item,1) = '-' THEN 1 ELSE 0 END)
FROM
(
SELECT bal_sheet_item = RTRIM(bal_sheet_item),
lenA = LEN(bal_sheet_item)
FROM dbo.YourTable
) AS x;
在較新的版本中,您可以說:
SELECT bal_sheet_item = TRIM('- ' FROM bal_sheet_item)
FROM dbo.YourTable;

uj5u.com熱心網友回復:
@JavaLifeLove - 如果您在發布資料示例時將它們發布為易于使用的資料,這將很有幫助,如下所示......
--===== If the temp table exists, drop it to make reruns easier in SSMS.
DROP TABLE IF EXISTS #TestTable;
GO
--===== Create and populate the temp table on-the-fly for such simple data.
-- Do a separate CREATE TABLE and an INSERT/VALUES for something more complex.
SELECT v.*
INTO #TestTable
FROM (VALUES
('middle-to high-income parents')
,('Assets -')
,('business – 1 year in their Certified program')
,('explain your assets')
,(' 10-12-15 years - ')
)v(bal_sheet_item)
;
GO
這不僅有助于解釋事情,而且會幫助那些試圖幫助你的人,因為他們中的很多人喜歡在發布對你問題的可能答案之前實際測驗他們的代碼。它也會吸引人們更快地提供幫助。:D
我還要檢查資料的來源是誰。人們不只是用破折號來結束某件事。這可能是一個非常強烈的跡象,表明在此程序中某些東西被丟棄了,我會在撰寫任何可能使壞資料永久存在的代碼之前讓某人知道這種可能性。
如果他們說“就這么做”,那么我會將解決方案變成一些其他人可以使用的可重復代碼,因為您可能不是唯一需要處理此類垃圾資料的人。
話雖如此,這里有一個高性能 iTVF(行內表值函式),它使用多種方法之一來解決這個問題。用法示例在函式的花盒中。
CREATE FUNCTION dbo.DropTrailingCharacter
/**********************************************************************************************************************
Purpose:
Remove the last given @pCharacter from the given @pString even if @pCharacter is followed by trailing spaces.
The final result is trimmed for both leading and trailing spaces.
Works for 2012 .
-----------------------------------------------------------------------------------------------------------------------
WARNING:
Modifying original data may not be the correct thing to do. For example, people don't arbitrarily add dashes to the
end of data. It may be an indication that a part of the original data may be missing. Check with the people that are
providing the data to ensure that's not what's happening.
-----------------------------------------------------------------------------------------------------------------------
Usage Example:
--===== Test table. This is not a part of the solution. It's just an example for usage.
DROP TABLE IF EXISTS #TestTable
;
SELECT v.*
INTO #TestTable
FROM (VALUES
('middle-to high-income parents')
,('Assets -')
,('business – 1 year in their Certified program')
,('explain your assets')
,(' 10-12-15 years - ')
)v(bal_sheet_item)
;
--===== Remove single trailing dash even if followed by spaces.
SELECT tt.bal_sheet_item
,bal_sheet_item_cleaned = ca.Cleaned
FROM #TestTable tt
CROSS APPLY dbo.DropTrailingCharacter(tt.bal_sheet_item,'-')ca
;
-----------------------------------------------------------------------------------------------------------------------
Revision History:
Ref 00 - 30 Oct 2022 - Jeff Moden
- Initial creation and unit test.
- Ref: https://stackoverflow.com/questions/74255805/remove-hyphen-from-end-of-string-in-sql-server/74256248
**********************************************************************************************************************/
(@pString VARCHAR(8000), @pCharacter CHAR(1))
RETURNS TABLE WITH SCHEMABINDING AS
RETURN
SELECT Cleaned = LTRIM(RTRIM(
IIF(RIGHT(ca.Trimmed,1) = @pCharacter
,LEFT(ca.Trimmed,LEN(ca.Trimmed)-1) --Character found and removed from end of of string.
,ca.Trimmed))) --Character not found. Keep everything
FROM (VALUES(RTRIM(@pString)))ca(Trimmed) --DRYs out the code above.
;
GO
uj5u.com熱心網友回復:
您可以像使用子字串查詢一樣簡單地實作它。
以下是我用來驗證場景的表創建查詢。
CREATE TABLE dbo.hyphentest(bal_sheet_item varchar(255));
INSERT dbo.hyphentest(bal_sheet_item) VALUES
('middle-to high-income parents'),
('Assets -'),
('business – 1 year in their Certified program'),
('explain your assets'),
('10-12-15 years - ');
要洗掉 - 符號,您可以首先修剪列,因此如果后面有任何尾跡空間 - 可以洗掉并使用帶有百分比的查詢,因為初始字符是任意的,但我們需要過濾以“-”或“-”結尾的字串' 然后用 len - 1 子串
SELECT
substring(TRIM(bal_sheet_item), 1, (len(TRIM(bal_sheet_item)) - 1))
FROM dbo.hyphentest WHERE TRIM(bal_sheet_item) LIKE '%-'
如果您想獲取所有行(包括連字符結尾的資料),那么您可以使用以下帶有大小寫的查詢
SELECT CASE WHEN TRIM(bal_sheet_item) LIKE '%-' THEN substring(TRIM(bal_sheet_item), 1, (len(TRIM(bal_sheet_item)) - 1))
ELSE bal_sheet_item END AS bal_sheet_item FROM dbo.hyphentest
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/529368.html
標籤:sqlsql服务器tsqlsql-server-2012
上一篇:SQL合并陳述句檢查約束錯誤
