7

私はMSSQLに比較的慣れていないので、質問が些細なことに聞こえるかもしれませんが、申し訳ありません。複数のフィールドを区切り文字で連結したい,。ただし、フィールドが空の場合、余分な,ものも結果文字列に含まれます。では、この問題を解決する簡単な方法はありますか?例えば、

SELECT VRI.Street_Number_and_Modifier + ',' + 
       VRI.Street_Direction + ',' + 
       VRI.Street_Name + ',' + 
       VRI.Street_Direction + ',' + 
       VRI.Street_Suffix + ',' + 
       VRI.Street_Post_Direction + ',' + 
       VRI.Unit
FROM View_Report_Information_Tables VRI
4

13 に答える 13

13

Lamakのこの修正バージョンは、NULLまたはスペース/空のみを含む文字列を処理します。

SELECT  COALESCE(NULLIF(VRI.Street_Number_and_Modifier, '') + ',', '') + 
        COALESCE(NULLIF(VRI.Street_Direction, '') + ',', '') + 
        COALESCE(NULLIF(VRI.Street_Name, '') + ',', '') + 
        COALESCE(NULLIF(VRI.Street_Direction, '') + ',', '') + 
        COALESCE(NULLIF(VRI.Street_Suffix, '') + ',', '') + 
        COALESCE(NULLIF(VRI.Street_Post_Direction, '') + ',', '') + 
        COALESCE(NULLIF(VRI.Unit, ''), '')
FROM View_Report_Information_Tables VRI
于 2011-03-18T17:34:44.320 に答える
9

少し違うアプローチで動作させることができました。各フィールドの先頭にコンマを置き、STUFF関数を使用して最初のフィールドを削除すると、次のようになりました。

SELECT 

    STUFF((COALESCE(', ' + NULLIF(VRI.Street_Number_and_Modifier, ''), '') +
        COALESCE(', ' + NULLIF(VRI.Street_Direction, ''), '') + 
        COALESCE(', ' + NULLIF(VRI.Street_Name, ''), '')) +
        COALESCE(', ' + NULLIF(VRI.Street_Direction, ''), '')) +
        COALESCE(', ' + NULLIF(VRI.Street_Suffix, ''), '')) +
        COALESCE(', ' + NULLIF(VRI.Street_Post_Direction, ''), '')) +
        COALESCE(', ' + NULLIF(VRI.Unit, ''), ''))
    , 1, 2, '')

FROM View_Report_Information_Tables AS VRI
于 2011-10-21T18:17:52.950 に答える
6

列がnullではなく空の場合は、次のことを試すことができます。

SELECT VRI.Street_Number_and_Modifier 
    + CASE WHEN VRI.Street_Number_and_Modifier <> '' THEN ', ' ELSE '' END
       + VRI.Street_Direction
    + CASE WHEN VRI.Street_Direction <> '' THEN ', ' ELSE '' END
       + VRI.Street_Name
    + CASE WHEN VRI.Street_Name <> '' THEN ', ' ELSE '' END
       + VRI.Street_Direction
    + CASE WHEN VRI.Street_Direction <> '' THEN ', ' ELSE '' END
       + VRI.Street_Suffix
    + CASE WHEN VRI.Street_Suffix <> '' THEN ', ' ELSE '' END
       + VRI.Street_Post_Direction
    + CASE WHEN VRI.Street_Post_Direction <> '' THEN ', ' ELSE '' END
       + VRI.Unit
    + CASE WHEN VRI.Unit<> '' THEN ', ' ELSE '' END
FROM View_Report_Information_Tables VRI
于 2011-03-18T17:25:00.860 に答える
3

SQL2008以降の場合

ISNULL(Colmn1 +'、'、'')を使用すると、常に先頭にコンマが続くため、処理する必要があります。例:

DECLARE @Column1 NVARCHAR(10) = 'Column1'
,   @Column2 NVARCHAR(10) = 'Column2'

SELECT  SUBSTRING(  ISNULL(@Column1 + ', ', '') + ISNULL(@Column2 + ', ', '')
            , 0 --Starting from 0 not 1 to remove leading comma
            , LEN(ISNULL(@Column1 + ', ', '') + ISNULL(@Column2 + ', ', '')))

または、これとは逆の方法でアプローチし、STUFF関数を使用して、きれいに見える最初のコンマを削除することもできます。例:

SELECT  STUFF   (ISNULL(( ', ' + @Column1), '') + ISNULL(( ', ' + @Column2), ''), 1, 2, N'')

SQL 2012+の場合、CONCAT関数を使用し、前の例と同様にSTUFFを使用して開始コンマを削除できますが、ISNULLを回避できます。

SELECT  STUFF(CONCAT( ', ' + @Column1, ', ' + @Column2), 1, 2, N'')

SQL 2017以降では、関数の最初の引数で指定された区切り文字を使用して複数の文字列列を連結/結合できるCONCAT_WSが導入されました。

MSドキュメントCONCAT_WS

MS Docの例:

SELECT CONCAT_WS(',' --delimiter
            ,'1 Microsoft Way', NULL, NULL, 'Redmond', 'WA', 98052) AS Address;
于 2019-01-14T10:57:33.517 に答える
2

これを試して:

SELECT  COALESCE(VRI.Street_Number_and_Modifier + ',','') + 
        COALESCE(VRI.Street_Direction + ',','') + 
        COALESCE(VRI.Street_Name + ',','') + 
        COALESCE(VRI.Street_Direction + ',','') + 
        COALESCE(VRI.Street_Suffix + ',','') + 
        COALESCE(VRI.Street_Post_Direction + ',','') + 
        COALESCE(VRI.Unit,'')
FROM View_Report_Information_Tables VRI
于 2011-03-18T17:12:55.390 に答える
2

短い答えですか、長い答えですか?

簡単な答え-いけません。これはフォーマットの問題であり、データベースの問題ではありません。

長い答え-SQLサーバーで文字列とnullを連結すると、結果はnullになります。したがって、ISNULLの組み合わせを使用できます

SELECT ISNULL(afield + ',','') + ISNULL(bfield + ',','')
于 2011-03-18T17:14:24.267 に答える
1

IsNull(fieldname、'')=''またはltrim(rtrim(fieldname))='')Then ... Else ... end+..の場合はselectcaseを使用する必要があります。

編集:
Androidモバイルから書かれました。
あなたの例の下。
以下の翻訳(ドイツ語から)が適用されます、参考までに:

Vorname:
名:surname
Benutzer:ユーザー

そして、ここにサンプルコードがあります:

CREATE VIEW [dbo].[V_RPT_SEL_Benutzer]  
AS  
SELECT 

    BE_ID AS RPT_UID, 

    CASE 
        WHEN (ISNULL(BE_Name, '0') = '0' OR LTRIM(RTRIM(BE_Name)) = '')  AND (ISNULL(BE_Vorname, '0') = '0' OR LTRIM(RTRIM(BE_Vorname)) = '')
            THEN ''
        WHEN (ISNULL(BE_Name, '0') = '0' OR LTRIM(RTRIM(BE_Name)) = '')
            THEN ISNULL(BE_Vorname, '') 
        WHEN (ISNULL(BE_Vorname, '0') = '0' OR LTRIM(RTRIM(BE_Vorname)) = '')
            THEN ISNULL(BE_Name, '') 
        ELSE
            ISNULL(BE_Name, '') + ', ' + ISNULL(BE_Vorname, '') 
    END AS RPT_Name, 

    ROW_NUMBER() OVER (ORDER BY BE_Name, BE_Vorname ASC) AS RPT_Sort 

FROM T_Benutzer  
于 2011-03-18T17:17:47.790 に答える
0

CASEを使用せずに入手できるかどうかを確認したかったのですが、入手できませんでした。私の長い道のり:

    SELECT case when isnull(nullif(VRI.Street_Number_and_Modifier, ''),'')='' then '' else VRI.Street_Number_and_Modifier end
+ case when isnull(nullif(VRI.Street_Direction, ''),'')='' then '' else ',' + VRI.Street_Direction end
+ case when isnull(nullif(VRI.Street_Name, ''),'')='' then '' else ',' + VRI.Street_Name end
+ case when isnull(nullif(VRI.Street_Suffix, ''),'')='' then '' else ',' + VRI.Street_Suffix end
+ case when isnull(nullif(VRI.Street_Post_Direction, ''),'')='' then '' else ',' + VRI.Street_Post_Direction end
+ case when isnull(nullif(VRI.Street_Post_Direction, ''),'')='' then '' else ',' + VRI.Street_Post_Direction end
FROM View_Report_Information_Tables VRI
于 2011-12-09T11:44:39.813 に答える
0

あなたは使用することができますISNULL(field + ',', '')

于 2011-03-18T17:13:38.127 に答える
0
SELECT isnull(VRI.Street_Number_and_Modifier + ',','')+
   isnull(VRI.Street_Direction + ',','')+
   isnull(VRI.Street_Name + ',','')+
   isnull(VRI.Street_Direction + ',','')+
   isnull(VRI.Street_Suffix + ',','')+
   isnull(VRI.Street_Post_Direction + ',','')+
   isnull(VRI.Unit,'')
FROM View_Report_Information_Tables VRI
于 2011-03-18T17:17:06.510 に答える
0

私はジャミエックの短い答えに完全に同意します。

それ以外の場合は、2つの列を連結するすべての場所でREPLACE([concat]、',,'、'、')を使用するという厄介な解決策を検討し、文字列の最初と最後からコンマを削除する方法を理解します。最初と最後の列が空である可能性があります。非常に厄介です。

于 2011-03-18T17:20:08.477 に答える
0
SELECT  COALESCE(NULLIF(ad.UDEFPROPERTYADDRESS_ADDRSS_LN_1_TXT, ''), ',')+
    COALESCE(NULLIF(ad.UDEFPROPERTYADDRESS_ADDRSS_LN_2_TXT, '') , ',')+
    COALESCE(NULLIF(ad.UDEFPROPERTYADDRESS_ADDRSS_LN_3_TXT, '') , ',')+
    COALESCE(NULLIF(ad.UDEFPROPERTYADDRESS_CITY_TXT, '') , ',')+
    COALESCE(NULLIF(ad.UDEFPROPERTYADDRESS_ST_TXT, '') , ',')+
    COALESCE(NULLIF(ad.UDEFPROPERTYADDRESS_CNTRY_TXT, '') , ',')+
    COALESCE(NULLIF(ad.UDEFPROPERTYADDRESS_PSTL_CD, '') , '')
    FROM ACCOUNT_DETAILS ad
于 2015-07-20T07:53:43.597 に答える
-1

null文字列の場合、これはコンマを追加しません

SELECT CONCAT_WS(', ', IFNULL(column1, NULL), 
         IFNULL(column2, NULL), IFNULL(column3, NULL), 
         IFNULL(column4, NULL), IFNULL(column5, NULL))
FROM yourtable
于 2016-07-10T16:17:10.903 に答える