2017-05-30 326 views
1

我需要從表中的7個不同列連接起來,並在每列的文本之間用連字符連接。SQL Server:刪除字符串開頭和結尾的連字符

在少數情況下,列有空值, 我得到像字符串; --Account--stands---

期望的輸出是Account-stands。請幫忙。

問候, Sajan

+0

歡迎#1。你到目前爲止嘗試了什麼?查看本指南:[如何創建最小,完整和可驗證的示例](https://stackoverflow.com/help/mcve)並嘗試包含示例代碼以顯示您的問題。 – MrLeeh

回答

1

在SQL Server中,你可以這樣做:

select stuff(coalesce('-' + col1, '') + 
      coalesce('-' + col2, '') + 
      coalesce('-' + col3, '') + 
      coalesce('-' + col4, '') + 
      coalesce('-' + col5, '') + 
      coalesce('-' + col6, '') + 
      coalesce('-' + col7, ''), 
       1, 1, '') 

許多其他的數據庫支持像CONCAT_WS()能夠簡化這一操作的功能。

+0

這會拋出語法錯誤,刪除'('每個'coalesce'之前。 –

+0

複製和粘貼的缺陷,我敢肯定:-) –

+0

@Wandered。 。 。謝謝。 –

0

您可以通過使用COALESCESTUFF實現它,避免與空值的問題''你可以在以下

select stuff(coalesce(nullif('-' + col1, '-'), '') + 
       coalesce(nullif('-' + col2, '-'), '') + 
       coalesce(nullif('-' + col3, '-'), '') + 
       coalesce(nullif('-' + col4, '-'), '') + 
       coalesce(nullif('-' + col5, '-'), '') + 
       coalesce(nullif('-' + col6, '-'), '') + 
       coalesce(nullif('-' + col7, '-'), ''), 
       1, 1, '') 
0

那麼你可以使用CASE表達式來檢查值是否是null或不加NULLIF

查詢

select case when t.[concat_string] like '%-' 
then left(t.[concat_string], len(t.[concat_string]) - 1) 
else t.[concat_string] end as [concat_string] from(
    select 
    case when [col1] is null or ltrim(rtrim([col1])) = '' 
     then '' else [col1] + '-' end + 
    case when [col2] is null or ltrim(rtrim([col2])) = '' 
     then '' else [col2] + '-' end + 
    case when [col3] is null or ltrim(rtrim([col3])) = '' 
     then '' else [col3] + '-' end + 
    case when [col4] is null or ltrim(rtrim([col4])) = '' 
     then '' else [col4] + '-' end + 
    case when [col5] is null or ltrim(rtrim([col5])) = '' 
     then '' else [col5] + '-' end + 
    case when [col6] is null or ltrim(rtrim([col6])) = '' 
     then '' else [col6] + '-' end + 
    case when [col7] is null or ltrim(rtrim([col7])) = '' 
     then '' else [col7] end as [concat_string] 
    from [your_table_name] 
)t; 

如果任何列不VARCHAR,那麼你可能需要CASTVARCHAR

+0

如此複雜的語法,更可讀的方法是使用'STUFF'和'COALESCE'來實現它。 –

+0

@StanislovasKalašnikovas:如果該值不爲空,則'COALESCE'不起作用,但''''不起作用。讓我的答案在另一個角度出現在那裏。 – Wanderer

0

假設你已經建立你的查詢關鍵詞,比如下面的一個。

select 
isnull(col1,'') + '-' + isnull(col2,'') + '-' + isnull(col3,'') as [columns] 
from yourtable 

用一個字符替換空值。例如嘗試下面的查詢

 select replace(replace ([columns],'|-',''), (case when 
charindex ('-|',replace ([columns],'|-','')) > 0 then '-|' else '|' end),'') 
    from(select 
     isnull(col1,'|') + '-' + isnull(col2,'|') + '-' +isnull(col3,'|')[columns] 
     from yourtable)temp 
0
DECLARE @String table (String nvarchar(max)) 
INSERT INTO @String 
SELECT '--Account--stands---' 

;WITH Cte 
AS 
(
SELECT String From 
(
SELECT Split.a.value('.', 'VARCHAR(100)') AS String, 
PATINDEX('%[a-zA-Z]%',Split.a.value('.', 'VARCHAR(100)')) AS ISChar FROM 
(
SELECT 
CAST('<S>' + REPLACE(STRING ,'--','</S><S>') + '</S>' AS XML) AS String from @String 
) AS A 
CROSS APPLY String.nodes('/S') AS Split(a) 

) dt 
Where dt.ISChar=1 
) 
SELECT DISTINCT STUFF((SELECT DISTINCT '- ' + String FROM Cte 
FOr xml path ('')),1,1,'') AS String 
FROM Cte 

輸出

String 
------- 
Account- stands 
相關問題