Oracle SQL SELECT незаполненные записи с ограничением "NOT NULL"
Для того, чтобы получить нужные мне данные, я должен выбрать записи, где нет данных. Некоторые строки не заселены (?).
Многие из этих "незаселенных" строк устанавливаются с ограничением "Не пусто". Это усложняет ситуацию! Я не могу просто искать строки NULL, потому что они НЕ NULL.
Я был в состоянии выбрать или исключить незаселенные строки несколькими методами. Эти методы, кажется, работают случайным образом или не работают.
Пример: выберите или исключите записи, в которых st.sart_code или st.sart_hold или st.sart_status или st.sart_date не заполнены.
SELECT
sp.sprite_id, sp.sprite_last, sp.sprite_first,
st.sart_code
/* 4 data retrieval methods are listed below.
For st.sart_code, I have substituted:
st.sart_hold, st.sart_status, and st.sart_date in the methods 2-4*/
FROM
sprite sp
JOIN sart st
on sp.sprite_pidm = st.sart_pidm
МЕТОД 1 - выбрать записи со строками, которые не имеют значения EVEA - st.sart_code может содержать несколько значений для одного sp.sprite_id. Это контрольный список предметов. Я ищу записи, которые не имеют EVEA в контрольном списке
Тип Varchar2 с ограничением Not Null
WHERE
Sp.sprite_change_ind is null
and
st.sart_pidm NOT IN
(SELECT st.sart_pidm
FROM sart st
WHERE st.sart_code = 'EVEA')
МЕТОД 2 - выбрать записи со строками, которые не имеют значения A2 - st.sart_hold может содержать несколько значений для одного sp.sprite_id. st.sart_hold может быть пустым / незаполненным (запись не имеет удержаний) или содержать несколько разных удержаний. Значения являются типами удержания счета. Я ищу записи, которые не имеют этого конкретного удержания "A2".
Тип Varchar2 с ограничением Not Null
РЕДАКТИРОВАТЬ Я только что понял, что это работает ТОЛЬКО если уже есть хотя бы один удержание. Если у пользователя нет удержаний, этот сценарий не будет выбирать записи (даже если у этого человека нет удержания A2).
WHERE
Sp.sprite_change_ind is null
and
group by sp.sprite_id, sp.sprite_last, sp.sprite_first, st.sart_hold
having sum(case when st.sart_hold = 'A2' then 1 else 0 end) = 0;
МЕТОД 3 - выбрать записи со строками, которые не имеют значения для st.sart_status - st.sart_status может содержать только 1 из 3 возможных значений или значение NO для одного sp.sprite_id. Значения являются статусами файлов. Я ищу записи, которые не имеют статуса
Тип Varchar2 с ограничением Not Null
WHERE
Sp.sprite_change_ind is null
and
trim(st.sart_status) is null
МЕТОД 4 - выбрать записи со строками, в которых НЕ пропущены ЛЮБЫЕ значения в st.sart_date (все поля даты в списке заполнены) - st.sart_date может содержать либо дату, либо быть пустым / незаполненным для одного sp.sprite_id. Значение является полученной датой для элемента контрольного списка. Я исключаю ЛЮБУЮ запись, у которой нет даты ни для одного из пунктов контрольного списка (может быть много элементов с соответствующими датами).
Тип даты с ограничением Not Null
Это немного по-другому, поэтому я снова включаю первую часть.
with MYVIEW AS
(
SELECT
sp.sprite_id AS Per_ID
sp.sprite_last,
sp.sprite_first,
st.sart_date as RECEIVED_DATE
FROM
sprite sp
JOIN sart st
on sp.sprite_pidm = st.sart_pidm
WHERE
Sp.sprite_change_ind is null
)
Select
Per_ID as "ID",
max(SPRITE_LAST_NAME) as "Last",
max(SPRITE_FIRST_NAME) as "First",
FROM MYVIEW
GROUP BY Per_ID
HAVING SUM(NVL2(RECEIVED_DATE,0,1)) = 0
Мои вопросы: мне было трудно найти методы работы с полями ограничения Not Null.
РЕДАКТИРОВАТЬ: Как я вижу, что находится в ограниченном поле "не ноль", когда оно не заполнено?
Почему описанные выше методы не всегда работают при поиске незаселенных полей? Некоторые методы работают только с определенными типами данных (varchar2, число, дата)? Или это связано с типом JOIN, который я использую? Что-то другое?
Есть ли другие методы, на которые кто-то может направить меня? Любое руководство будет с благодарностью!
Какова правильная терминология для "выбора записей, в которых есть незаполненные поля [ColumnName DataType() NOT NULL]?" Если бы я знал терминологию того, что я пытаюсь спросить, я мог бы ее искать.
ПРИМЕЧАНИЕ. Мои сценарии обычно НАМНОГО более сложны, чем примеры выше. У меня обычно есть как минимум 3 соединения и много предложений WHERE.
Пожалуйста, дайте мне знать, если этот вопрос слишком сложен! Я здесь новичок.:-)
1 ответ
Возможно, более длинный комментарий, чем ответ, но так как здесь не так много активности...
Oracle SQL SELECT пустые записи с ограничением "НЕ ПУСТО" тетя Анита
- Как у вас есть пробелы, если они не равны нулю - это отчасти то, что вы спрашиваете?Алекс Пул
- Это одна из проблем.Тетя Анита
Мало что нужно знать:
- В Oracle пустая строка
''
это то же самое, чтоNULL
заVARCHAR
/CHAR
, Это отход от "стандартного" SQL, который делает различие между пустыми строками и пустыми строками. TRIM
вернусьNULL
заNULL
/ пустые строки / пробелы только строки.- но строки, состоящие из пробелов / невидимых символов, не являются нулевыми.Даже если они содержат только персонажа
CHR(0)
(иначе NUL - только с однимL) - а также
TRIM
не удаляет невидимые символы Только пробелы.
Чтобы убедить себя, попробуйте те:
select NVL2(CAST('' AS VARCHAR2(20)), 'NOT NULL','NULL') FROM DUAL
select NVL2(CAST('' AS CHAR(20)), 'NOT NULL','NULL') FROM DUAL
select NVL2(TRIM(' '), 'NOT NULL','NULL') FROM DUAL
select NVL2(' ', 'NOT NULL','NULL') FROM DUAL
select NVL2(CHR(10), 'NOT NULL','NULL') FROM DUAL
select NVL2(CHR(0), 'NOT NULL','NULL') FROM DUAL
select NVL2(TRIM(' '||CHR(10)), 'NOT NULL','NULL') FROM DUAL
select NVL2(TRIM(' '||CHR(0)), 'NOT NULL','NULL') FROM DUAL
Итак, я думаю, что ваши "не пустые поля" на самом деле содержат какие-то невидимые символы - или, может быть, даже одинCHR(0)
, Это вполне возможно, так как в некоторых языках символ NUL используется в качестве ограничителя строки - и, возможно, проник в вашу БД во время импорта данных для пустых / пропущенных значений. Преднамеренно или нет.
Чтобы проверить это, вы можете попробоватьRAWTOHEX
проверить ваши подозрительные поля данных. В следующем примере обратите внимание, как средний NUL
персонаж скрывается незамеченным при отображении в виде строки. Но не в необработанном шестнадцатеричном дампе:
SQL> select 'abc' || chr(0) || 'def' AS str,
RAWTOHEX('abc' || CHR(0) || 'def') AS hex FROM DUAL
STR HEX
abcdef 61626300646566
^^^^^^ ^^
Is there something Yes !
special here?
Пожалуйста, дайте мне знать, если этот вопрос слишком сложен! Я здесь новичок.:-)
: D "Stackru" обычно намного эффективнее, если вы можете сузить проблему. Идеально, чтобы обеспечить некоторый воспроизводимый случай (ранее известный как SSCCE или MCVE).
Потратьте время, чтобы внимательно изучить ваши данные, и, если необходимо, не стесняйтесь опубликовать другой более сфокусированный ответ.