|
Программирование >> Хронологические базы данных
Проверка наличия значений true, false и unknown. Если р - это заключенное в скобки условное выражение, то следующие операторы также являются условными выражениями. р IS [ NOT р IS [ NOT р IS [ NOT TRUE FALSE UNKNOWN Значения этих выражений показаны в приведенной ниже таблице истинности.
Обратите внимание, что выражения р IS NOT TRUE и NOT p не являются эквивалентными. Замечание. Выражение р IS UNKNOWN соответствует описанному выше оператору MAYBE(p). I Условие MATCH. Синтаксис параметра <условие match> (см. приложение А) содержит ключевые слова PARTIAL и FULL (их использование в приложении А не рассматривается). Эти опции могут повлиять на результат, если в данных присутствуют неопределенные значения. <конструктор строкиУ MATCH [ UNIQUE ] [ PARTIAL I FULL ] ( <табличное выражение>) Существует шесть возможных случаев, зависящих от того, указана ли опция UNIQUE, а также указана ли опция PARTIAL либо FULL. Подробное обсуждение этого вопроса достаточно сложное и выходит за рамки настоящей главы. Дополнительную информацию можно найти в [4.19]. I Условие EXISTS. См. комментарий к [18.6]. Скалярные выражения Литераты. Ключевое слово NULL может быть использовано как способ литерального представления неопределенных значений (например, в операторе INSERT). Тем не менее следует заметить, что данное ключевое слово может указываться не во всех контекстах, в которых допускается использование литералов. Согласно стандарту не существует значения параметра <литерал> для представления неопределенных значений, хотя в некоторых случаях для указания необходимости использования неопределенного значения может употребляться ключевое слово NULL [4.22]. Поэтому, например, ключевое слово NULL нельзя явно использовать как операнд в простых операциях сравнения, т.е. выражение WHERE X = NULL некорректно. функция COALESCE. Это SQL-аналог функции IF UNK (см. раздел 18.2), определенной выше в данной главе. Обобщающие функции. Обобщаюшие функции языка SQL, например SUM, AVG и т.п., не ведут себя в соответствии с правилами для скалярных операторов, изложенными выше, в разделе 18.2. Вместо этого они просто игнорируют любое неопределенное значение в своих аргументах (исключение составляет функция COUNT(*), при вычислении которой неопределенное значение трактуется, как обычное значение). Кроме того, если этим функциям в качестве аргумента передается пустое множество, они возвращают неопределенное значение. Исключение и здесь составляет функция COUNT, которая в данном случае возвращает значение нуль . (Сравните с трактовкой обработки пустых множеств, изложенной в главе 7.) Скачярные подчиненные запросы. Если скалярное выражение фактически является заключенным в скобки табличным выражением, например (SELECT S.CITY FROM S WHERE S.St=Sl), то вполне естественно, что результатом вычисления подобного табличного выражения должна быть таблица, содержащая единственный столбец и единственную строку. Тогда значением скалярного выражения в целом будет то единственное скалярное значение, которое содержится в результирующей таблице. Но если результатом вычисления табличного выражения является таблица, не содержащая ни одной строки, в языке SQL значение этого скалярного выражения определяется, как неопределенное (NULL). Ключи Ниже кратко перечислены основные особенности использования неопределенных значений в ключевых атрибутах, характерные для языка SQL. Потенциальные ключи. Пусть С - это атрибут, являющийся частью потенциального ключа К некоторой базовой таблицы. Если ключ К является первичным, то язык SQL запрещает использование неопределенных значений в столбце С (обеспечивая таким образом соблюдение ограничения целостности сущности). Тем не менее, если ключ К не является первичным, язык SQL разрешает присутствие в столбце С любого количества неопределенных значений (конечно, вместе с любым количеством значений, не являющихся неопределенными). Внешние ключи. Правила, определяющие смысл соответствия значения заданного внешнего ключа некоторому значению соответствующего потенциального ключа (при наличии в них неопределенных значений), очень сложны. В данном случае их подробное обсуждение опускается. Заметим только, что они, в основном, совпадают с правилами, установленными для условий MATCH (см. выше). Неопределенные значения также оказывают влияние на выполнение действий по установленным правилам поддержки ссылочной целостности (CASCADE, SET NULL и т.д.), заданным в предложениях ON DELETE и ON UPDATE. Дополнительно поддерживается действие SET DEFAULT, требующее установки заданного значения по умолчанию. Для простоты изложения подробное обсуждение этой проблемы здесь опущено. Заинтересованный читатель может обратиться к [4.19]. Внедренные SQL-операторы Индикаторные переменные. Рассмотрим конкретный пример внедренного SQL-выражения. (Он уже приводился в главе 4 при описании однострочного оператора SELECT.) EXEC SQL SELECT STATUS, CITY INTO :RANK, :С1ТУ FROM S WHERE Si = :GIVENSi ; Предположим, что для некоторых поставщиков атрибут STATUS может содержать неопределенное значение. Тогда выполнение приведенного выще оператора SELECT завершится неудачей, если в выбранном кортеже атрибут STATUS будет содержать неопределенное значение (в переменную SQLSTATE будет помещен код ошибки 22002). В общем случае, когда существует вероятность, что выбираемое значение может оказаться неопределенным, для данного атрибута пользователь должен указать, помимо целевой, еще и индикаторную пере.менную. Пример определения индикаторной переменной приведен ниже. EXEC SQL SELECT STATUS, CITY INTO :RANK INDICATOR :RANKIND, :CITY FROM S WHERE Si = :GIVENSi ; IF RANKIND = -1 THEN ..... /* Атрибут STATUS содержит величину NULL */; END IF; Если значение, которое нужно выбрать, является неопределенным и для данного атрибута задана индикаторная переменная, то в эту переменную будет помещено значение -1 (значение, помещаемое в целевую переменную, зависит от реализации). Упорядочение. Для упорядочения строк, полученных в результате вычисления табличного выражения, в определении курсора используется фраза ORDER BY. (Безусловно, она может использоваться и при вводе интерактивных запросов.) Возникает вопрос: Каков относительный порядок двух скалярных значений А и В, если либо А является неопределенным значением, либо В является неопределенным значением, либо оба они одновременно являются неопределенными значениями? . В стандарте языка SQL на этот вопрос даются следующие ответы. L В процессе упорядочения все неопределенные значения считаются равными одно другому. 2. В процессе упорядочения все неопределенные значения считаются либо большими всех остальных значений, либо меньшими их всех (реальный выбор одной из этих возможностей зависит от конкретной реализации). 18.8. Резюме в этой главе обсуждались проблема отсутствующей информации и выбранный в настоящее время подход к ее решению, базирующийся на использовании неопределенных значений и трехзначной логики. Было показано, что неопределенное значение на самом деле значением не является, хотя так принято говорить (например, говорят, что
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |