2017-05-30 18 views
1

Ich muss aus 7 verschiedenen Spalten einer Tabelle mit Bindestrich zwischen Text aus jeder Spalte verketten.SQL Server: Entfernen Bindestriche am Anfang und Ende der Zeichenfolge

In wenigen Fällen, in denen Spalten Nullen haben, bekomme ich string wie; --Account--stands---

Der gewünschte Ausgang ist Account-stands. Bitte helfen Sie.

Grüße, Sajan

+0

Willkommen bei Stackoverflow. Was hast du bisher versucht? Sehen Sie sich dieses Handbuch an: [Erstellen Sie ein minimales, vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) und versuchen Sie, einen Beispielcode einzubinden, um Ihr Problem zu zeigen. – MrLeeh

Antwort

1

In SQL Server können Sie tun:

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

Viele andere Datenbanken eine Funktion wie CONCAT_WS() unterstützen, die diesen Vorgang vereinfacht.

+0

Dies wird Syntaxfehler werfen, entfernen '(' vor jedem 'Koaleszieren'. –

+0

Die Fallstricke von Copy & Paste, ich bin sicher :-) –

+0

@Wanded. . . Vielen Dank. –

0

Sie könnten es erreichen, indem er mit COALESCE und STUFF und Probleme mit leeren Werten zu vermeiden '' Sie NULLIF in folgenden

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

Dann könnten Sie CASE Ausdruck verwenden hinzufügen könnte der Wert null oder nicht zu prüfen, ob.

Abfrage

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; 

Und wenn eine der Spalten nicht VARCHAR sind, müssen Sie kann dann auf CAST es VARCHAR

+0

So komplexe Syntax, ist wirklich lesbarer Weg, es zu erreichen mit 'STUFF' und' COALESCE'. –

+0

@ StanislovasKalašnikovas: 'COALESCE' hilft nicht, wenn der Wert nicht null ist, sondern '' ''. Und lassen Sie meine Antwort als eine andere Perspektive da sein. – Wanderer

0

Sie bauen Ihre Abfrage wie die unter einem Unter der Annahme.

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

Ersetzen Sie den Nullwert durch ein Zeichen. Zum Beispiel versuchen, die unter Abfrage

 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 

OutPut

String 
------- 
Account- stands 
Verwandte Themen