【问题标题】:Space character that persists in varchar2 in Oracle 11g for display in SSRS 2008保留在 Oracle 11g 中的 varchar2 中以在 SSRS 2008 中显示的空格字符
【发布时间】:2011-01-12 09:39:27
【问题描述】:

是否有空格或其他非打印字符可以插入到不会被修剪掉并导致 NULL 的 varchar2 列中?

我只想在列中插入一个空白,以便它在 SSRS 2008 报告中不显示任何内容。该列是 PK 的一部分,因此它不能为 NULL。当然使用 '' 不起作用,因为这在 Oracle 中被视为 NULL,而 ' ' 不起作用,因为它是 varchar2 并被修剪为 NULL。

那么有没有我可以插入的文字值,它会在 SSRS 中显示为空,但也可以插入到 Oracle 11g 中的不可为空的 varchar2 列中?

想了想,我想像制表符这样的东西可以完成这项工作。但我期待您的建议。

更新

哎呀。猜猜修剪行为从何而来?我自己的 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;

【问题讨论】:

  • 既然列是PK,不能为空,为什么要在里面插入空格呢?要么数据模型不正确,要么只是可以在报表端处理的呈现问题。
  • 由于报表使用矩阵(即数据透视),当整个时间段的数据为空时,报表将不显示任何内容。这是不可取的。相反,我需要为每周列设置一行,以便在所有 4 或 5 周内显示该期间的“无支付发票”。因此,我正在 UNION ALL 选择一个“种子行”以在根本没有发票时使用。在该种子行中,没有帐户单位。所以在这种情况下它是正确的空白,而不是 null。该表不用于持久存储,而只是用于报告的临时表。

标签: null whitespace ssrs-2008 oracle11g varchar2


【解决方案1】:

在我下面的测试中,单个空格没有被转换为空:

  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.

在插入之前你是否修剪了这些值?

【讨论】:

  • 是的。看那个。我正在修剪。很抱歉,谢谢你的好收获。
猜你喜欢
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
相关资源
最近更新 更多