Oracle SQL - Нулевой код не работает - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь получить денежную сумму, связанную с идентификаторами проекта, однако мне нужны только данные, где существует идентификатор проекта (не пусто)

Когда я набираю свой код SQL ниже ...

SELECT project_id, monetary_amount, journal_line_date 
FROM PS_JRNL_LN 
where project_id is not null
  and journal_line_date BETWEEN to_date ('2020/01/01','yyyy/mm/dd') 
                            AND TO_DATE ('2020/03/04','yyyy/mm/dd')

этот запрос работает, но я все еще получаю пустые значения в моем результате

Ответы [ 5 ]

0 голосов
/ 13 апреля 2020

Внутреннее соединение этой таблицы журнала с источником правды для идентификаторов проектов. Предполагая, что в этой таблице нет «пустых» идентификаторов, вы не получите «пробелы» в своем результате.

например

SELECT j.project_id, j.monetary_amount, j.journal_line_date 
FROM PS_JRNL_LN J

  INNER JOIN PROJECT_MASTER P ON j.project_id = p.id /* should remove "blanks" */

where j.journal_line_date >= to_date ('2020/01/01','yyyy/mm/dd') 
and  j.journal_line_date < TO_DATE ('2020/03/05','yyyy/mm/dd')

Обратите внимание, я никогда не использую between для диапазонов дат приведенный выше шаблон с использованием >= & < является более надежным (поскольку он работает независимо от точности данных во времени).

0 голосов
/ 13 апреля 2020

Попробуйте использовать условие фильтра:

ltrim(rtrim(project_id)) <> ''
0 голосов
/ 12 апреля 2020

Вот кое-что, что может помочь вам узнать, что происходит в столбце project_id. (Скорее всего, набор ' ' значений, что означает непустую строку, состоящую из одного пробела.)

select project_id, dump(project_id)
from   ps_jrnl_ln
where  ltrim(project_id, chr(32) || chr(9)) is null
  and  project_id is not null
;

DUMP показывает, что именно хранится в вашей таблице. 32 - код ASCII для одного пробела; 9 (или 09) - код для горизонтальной табуляции. Я ожидаю, что вы получите строки, где столбец DUMP показывает один символ с кодом 32. Но - кто знает; Вы можете найти и другие вещи.

Это поможет вам понять, что находится в столбце. (Вы также можете проверить describe ps_jrnl_ln - вы можете узнать, что столбец объявлен not null !!!)

Если вы найдете группу строк, где идентификатор проекта - это один пробел, конечно, в вашем фактическом запросе вам придется изменить

where project_id is not null

на

where ltrim(project_id, chr(32) || chr(9)) is not null

Или, возможно, если в качестве заполнителя для null:

* используется действительно один пробел 1021 *
0 голосов
/ 13 апреля 2020

Немного вещей, которые вы должны реализовать в дизайне таблицы, чтобы предотвратить проблему, прежде чем бороться с данными:

  1. Добавьте ограничение NOT NULL к столбцу.
  2. Добавьте ограничение CHECK, чтобы предотвратить появление нежелательных символов, таких как пробелы и т. Д. c. и разрешать только те данные, которые вы хотите загрузить.
  3. Если вы не хотите проверять ограничение, то обрабатывайте его во время загрузки данных, используя TRIM.
  4. При необходимости, сделайте PROJECT_ID столбец первичный ключ, который неявно не допускает значения NULL. Как правило, столбец идентификатора в таблице указывает на то, что это первичный ключ, но он может отличаться в вашем случае использования.

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

0 голосов
/ 12 апреля 2020

У вас нет нулей, но добавьте пробелы ниже в вашем запросе

 SELECT project_id, monetary_amount, 
  journal_line_date 
  FROM PS_JRNL_LN 
    where ( project_id is not null or
   ( project_id is not 
     null   
    and  LTRIM( RTrim(project_id)) not 
       like '') 
     and 
     journal_line_date BETWEEN 
     to_date ('2020/01/01','yyyy/mm/dd') 
                        AND TO_DATE 
   ('2020/03/04','yyyy/mm/dd')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...