Символ пробела, который сохраняется в varchar2 в Oracle 11g для отображения в SSRS 2008

Есть ли пробел или другой непечатаемый символ, который я могу вставить в столбец varchar2, который не будет обрезан и приведет к NULL?

Я просто хочу вставить пробел в столбец, чтобы он ничего не отображал в отчете SSRS 2008. Столбец является частью PK, поэтому он не может быть NULL. Конечно, использование '' не работает, так как это рассматривается как NULL в Oracle, а ' ' не работает, потому что это varchar2 и обрезано до NULL.

Итак, есть ли буквальное значение, которое я могу вставить вместо этого, которое не будет отображаться как ничего в SSRS, но также может быть вставлено в ненулевой столбец varchar2 в Oracle 11g?

Если подумать об этом на мгновение, я думаю, что что-то вроде символа табуляции могло бы справиться с этой задачей. Но жду ваших предложений.

ОБНОВЛЕНИЕ

Упс. Угадайте, откуда взялось поведение обрезки? Мой собственный РТРИМ! Извини за это. Скажем так, меня ввела в заблуждение моя неопытность в 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;

person ErikE    schedule 11.01.2011    source источник
comment
Поскольку столбец является PK и не может быть нулевым, почему вы хотите вставить в него пробел? Либо модель данных неверна, либо это просто проблема с представлением, которую можно решить на стороне отчета.   -  person Eddie Awad    schedule 11.01.2011
comment
Поскольку в отчете используется матрица (т. е. сводные данные), когда весь период данных равен нулю, в отчете вообще ничего не будет отображаться. Это нежелательно. Вместо этого мне нужна строка для столбца каждой недели, которая будет сводиться, чтобы отображать не оплаченные счета за этот период со всеми 4 или 5 неделями. Таким образом, я ОБЪЕДИНЯЮ ВСЕ ВЫБИРАЮ начальную строку для использования, когда счетов-фактур нет вообще. В этой исходной строке нет расчетной единицы. Таким образом, в этом случае он должен быть пустым, а не нулевым. Таблица не предназначена для постоянного хранения, а является временной таблицей для отчета.   -  person ErikE    schedule 12.01.2011


Ответы (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.

Вы обрезаете значения перед вставкой?

person Eddie Awad    schedule 11.01.2011
comment
да. Посмотри на это. Я обрезаю. Извините за это, и спасибо за хороший улов. - person ErikE; 12.01.2011