我需要從表中的7個不同列連接起來,並在每列的文本之間用連字符連接。SQL Server:刪除字符串開頭和結尾的連字符
在少數情況下,列有空值, 我得到像字符串; --Account--stands---
期望的輸出是Account-stands
。請幫忙。
問候, Sajan
我需要從表中的7個不同列連接起來,並在每列的文本之間用連字符連接。SQL Server:刪除字符串開頭和結尾的連字符
在少數情況下,列有空值, 我得到像字符串; --Account--stands---
期望的輸出是Account-stands
。請幫忙。
問候, Sajan
在SQL Server中,你可以這樣做:
select stuff(coalesce('-' + col1, '') +
coalesce('-' + col2, '') +
coalesce('-' + col3, '') +
coalesce('-' + col4, '') +
coalesce('-' + col5, '') +
coalesce('-' + col6, '') +
coalesce('-' + col7, ''),
1, 1, '')
許多其他的數據庫支持像CONCAT_WS()
能夠簡化這一操作的功能。
這會拋出語法錯誤,刪除'('每個'coalesce'之前。 –
複製和粘貼的缺陷,我敢肯定:-) –
@Wandered。 。 。謝謝。 –
您可以通過使用COALESCE
和STUFF
實現它,避免與空值的問題''
你可以在以下
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, '')
那麼你可以使用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
,那麼你可能需要CAST
它VARCHAR
如此複雜的語法,更可讀的方法是使用'STUFF'和'COALESCE'來實現它。 –
@StanislovasKalašnikovas:如果該值不爲空,則'COALESCE'不起作用,但''''不起作用。讓我的答案在另一個角度出現在那裏。 – Wanderer
假設你已經建立你的查詢關鍵詞,比如下面的一個。
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
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
歡迎#1。你到目前爲止嘗試了什麼?查看本指南:[如何創建最小,完整和可驗證的示例](https://stackoverflow.com/help/mcve)並嘗試包含示例代碼以顯示您的問題。 – MrLeeh