2011-01-11 3 views
2

varchar2列に挿入してNULLになるvarchar2列に挿入できるスペースまたは他の非印刷文字はありますか?SSRS 2008での表示のためにOracle 11gのvarchar2に残る空白文字

SSRS 2008レポートに何も表示しないように、空白を列に挿入するだけです。カラムはPKの一部であるため、NULLにすることはできません。もちろん''を使用すると、OracleではNULLと見なされ、' 'はvarchar2であり、NULLになるように調整されているため機能しません。

代わりにSSRSには何も表示されませんが、Oracle 11gのnullableでないvarchar2カラムにも挿入できるリテラル値が挿入できますか?

すぐに考えてみると、タブ文字のようなものが仕事をすることができると思います。しかし、私はあなたの提案を楽しみにしています。

UPDATE

おっと。トリミングの振る舞いはどこから来たのでしょうか?私自身のRTRIM!申し訳ありません。ただ、私がOracleの経験の浅さから誤解を招いていると言いましょう。私の不満は、私の質問ではなく製品にあると判断するための私の不満です。しかし、ちょっと、ちょっと単純なクエリではありません。下記の私のテストで

INSERT INTO WeeklyInvoice (GUID, Mo, VendorName, CostCenter, WkNum, Amt) 
SELECT 
    ExecID, 
    Mo, 
    VendorName, 
    CostCenter, 
    WkNum, 
    Amt 
FROM (
    WITH CostCenters AS (
     SELECT REGEXP_SUBSTR(CostCenterList, '[^,]+', 1, LEVEL) CostCenter 
     FROM DUAL 
     CONNECT BY LEVEL <= Length(CostCenterList) - Length(Replace(CostCenterList, ',', '')) + 1 
    ), Invoices AS (
     SELECT 
     TRUNC(I.Invoice_Dte, 'MM') Mo, 
     (TRUNC(I.Invoice_Dte, 'W') - TRUNC(I.Invoice_Dte, 'MM'))/7 + 1 WkNum, 
     I.Vendor, 
     V.Vendor_VName, 
     RTrim(D.Dis_Acct_Unit) CostCenter, 
     D.To_Base_Amt 
     FROM 
     CostCenters CC 
     CROSS JOIN prod.IcCompany C 
     INNER JOIN prod.ApDistrib D 
      ON C.Company = D.Company 
      AND D.Dis_Acct_Unit = CC.CostCenter 
     INNER JOIN prod.ApInvoice I 
      ON D.Invoice = I.Invoice 
      AND D.Vendor = I.Vendor 
      AND D.Suffix = I.Suffix 
      AND D.Company = I.Company 
     INNER JOIN prod.ApVenMast V ON I.Vendor = V.Vendor 
     WHERE 
     D.Cancel_Seq = 0 
     AND I.Cancel_Seq = 0 
     AND I.Invoice_Dte >= ADD_MONTHS(FromDate, -2) 
     AND I.Invoice_Dte < ToDate 
    ), Months AS (
     SELECT ADD_MONTHS(FromDate, LEVEL - 1) Mo 
     FROM DUAL 
     CONNECT BY LEVEL <= MONTHS_BETWEEN(ToDate, ADD_MONTHS(FromDate, -2)) 
    ), Names AS (
     SELECT DISTINCT 
     I.Mo, 
     I.Vendor, 
     I.Vendor_VName, 
     I.CostCenter 
     FROM Invoices I 
     UNION ALL 
     SELECT M.Mo, '0', 'No Paid Invoices', ' ' 
     FROM Months M 
     WHERE 
     NOT EXISTS (
      SELECT I.* 
      FROM Invoices I 
      WHERE I.Mo = M.Mo 
     ) 
    ), Weeks AS (
     SELECT LEVEL WkNum FROM DUAL CONNECT BY LEVEL <= 5 
    ) 
    SELECT 
     N.Mo, 
     N.Vendor_VName VendorName, 
     N.CostCenter, 
     W.WkNum, 
     Sum(I.To_Base_Amt) Amt 
    FROM 
     Names N 
     INNER JOIN Weeks W 
     ON W.WkNum < 5 
     OR EXTRACT (MONTH FROM (N.Mo + 28)) = EXTRACT (MONTH FROM N.Mo) 
     LEFT JOIN Invoices I 
     ON N.CostCenter = I.CostCenter 
     AND N.Vendor = I.Vendor 
     AND N.Mo = I.Mo 
     AND W.WkNum = I.WkNum 
    GROUP BY 
     N.Mo, 
     N.Vendor_VName, 
     N.CostCenter, 
     W.WkNum 
) X; 
+0

この列はPKなのでnullにできないので、なぜ空白を挿入したいのですか?データモデルが正しくないか、レポート側で処理できるプレゼンテーションの問題です。 –

+0

レポートは行列を使用するため(データをピボットする)、データの全期間がNULLの場合、レポートには何も表示されません。これは望ましくない。代わりに、私はすべての4週間または5週間でその期間の "支払われない請求書"を表示するためにピボットされる毎週の列の行が必要です。したがって、私はすべての請求書がない場合に使用する "シード行"を選択するUNION ALLです。そのシード行には、アカウント単位はありません。この場合、空ではなく、正しく空白になります。このテーブルは永続ストレージ用ではなく、レポートの一時テーブルに過ぎません。 – ErikE

答えて

2

、単一のスペースはnullに変換されなかった。

SQL> CREATE TABLE t (col VARCHAR2 (10) NOT NULL); 

    Table created. 

    SQL> INSERT INTO t (col) 
    2  VALUES (' '); 

    1 row created. 

    SQL> SELECT CASE col WHEN ' ' THEN 'I am a single space' ELSE 'I am not a space' END AS col FROM t; 

    COL 
    ------------------- 
    I am a single space 

    1 row selected. 

    SQL> SELECT LENGTH (col) FROM t; 
    LENGTH(COL) 
    ----------- 
      1 

    1 row selected. 

あなたは挿入する前に値をトリミングしていますか?

+0

はい。あれ見てよ。私はトリミングしています。申し訳ありません、そして良いキャッチのためにありがとう。 – ErikE

関連する問題