Oracle нет завершающей кавычки
В чем разница между одинарными и двойными кавычками в SQL?
Одинарные кавычки используются для обозначения начала и конца строки в SQL. Двойные кавычки обычно не используются в SQL, но они могут варьироваться в зависимости от базы данных.
Придерживайтесь использования одинарных кавычек.
В любом случае, это основное использование. Вы можете использовать одинарные кавычки для псевдонима столбца - где вы хотите, чтобы имя столбца, на которое вы ссылаетесь в коде своего приложения, отличалось от того, что столбец фактически называется в базе данных. Например: PRODUCT.id будет более читабельным product_id , так что вы используете одно из следующих:
- SELECT PRODUCT.id AS product_id
- SELECT PRODUCT.id 'product_id'
Либо работает в Oracle, SQL Server, MySQL . но я знаю, что некоторые говорили, что TOAD IDE, кажется, дает некоторое горе при использовании подхода одинарных кавычек.
Вы должны использовать одинарные кавычки, когда псевдоним столбца содержит, например, символ пробела product id , но не рекомендуется, чтобы псевдоним столбца был больше одного слова.
Двойные кавычки обычно используются для имен объектов (например, имя столбца «Имя»). Это часть стандарта SQL-92.
Я имел в виду имена столбцов, но это касается и псевдонимов. Я бы посоветовал использовать двойные кавычки для псевдонимов и имен с необычными символами из-за стандарта SQL-92. SELECT * FROM USERS 'Users' не работает в SQL Server, но SELECT * FROM USERS "Users" работает.
Я всегда ошибаюсь, пока не осознаю простое правило: [S] одиночная кавычка для [S] trings, [D] двойная кавычка для вещей в [D] атабазе
SELECT PRODUCT.id 'product_id' не будет работать в Oracle. Одинарные кавычки предназначены только для символьных литералов. Они не могут использоваться для идентификаторов в (стандартном) SQL (хотя некоторые СУБД просто игнорируют стандарт SQL, когда дело доходит до цитируемых идентификаторов)
Простое правило для нас, чтобы помнить, что использовать в этом случае:
- [ S ] одиночные кавычки для [ S ] trings; [ D ] двойные кавычки для идентификаторов [ D ] атабазы;
В MySQL и MariaDB, то ` (кавычка) символ такой же , как « символ. Вы можете использовать » , когда ваш SQL_MODE был ANSI_QUOTES включен.
Чтобы уточнить, backtick (`) может использоваться для разделения идентификаторов независимо от того, включен ли ANSI_QUOTES, но если включен ANSI_QUOTES, то« нельзя использовать двойные кавычки для кавычек буквенных строк, потому что это интерпретируется как идентификатор ». ( источник ). (Это все предполагает, что вы говорите о MySQL, ум.)
В Oracle операторах, в которых требуется передача запроса в качестве текстовой строки
иногда в тексте sql строки требуется передать символ кавычек
обычно это взывает недоумение интерпретатора запросов oracle
для этого используется оператор Oracle — q
рассмотрим несколько примеров
например фраза I’m О’Коннор
Подари, продай, обменяй — множество недорогих и отличных вещей: объявления вместо AVITO — ВКонтакте
Как избежать одинарных кавычек в MySQL
Как мне вставить значение в MySQL, состоящее из одинарных или двойных кавычек. т.е.
Одиночная кавычка создаст проблемы. Могут быть и другие escape-символы.
Как правильно вставить данные?
SELECT ‘This is Ashok»s Pen.’;
Поэтому внутри строки замените каждую одиночную кавычку двумя из них.
SELECT ‘This is Ashok\’s Pen.’
‘- это escape-символ. Итак, ваша строка должна быть:
Если вы используете некоторый интерфейсный код, вам необходимо выполнить замену строки перед отправкой данных в хранимую процедуру.
а затем передать значение хранимой процедуре.
В любой библиотеке, которую вы используете для общения с MySQL, будет встроена функция экранирования, например, в PHP вы можете использовать mysqli_real_escape_string или PDO :: quote
Если вы используете подготовленные операторы, драйвер обработает любое экранирование. Например (Java):
Используйте этот код:
Это решит вашу проблему, поскольку база данных не может обнаружить специальные символы строки.
Есть другой способ сделать это, который может быть или не быть более безопасным, в зависимости от вашей точки зрения. Это требует MySQL 5.6 или более поздней версии , из — за использования конкретной функции строки: FROM_BASE64 .
В этой цитате есть множество одинарных и двойных кавычек, и вставить ее в MySQL было бы очень сложно. Если вы вставляете это из программы, легко избежать кавычек и т. Д. Но, если вам нужно поместить это в сценарий SQL, вам придется отредактировать текст (чтобы избежать кавычек), что может быть подвержено ошибкам. или чувствительны к переносу слов и т. д.
Вместо этого вы можете кодировать текст Base64, чтобы получить "чистую" строку:
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K
Некоторые примечания о кодировке Base64:
- Кодировка Base64 — это двоичная кодировка , поэтому вам лучше убедиться, что вы правильно указали свой набор символов при кодировании, потому что MySQL собирается декодировать строку в кодировке Base64 в байты, а затем интерпретировать их. Быть уверенным base64 MySQL согласен с кодировкой символов (я рекомендую UTF-8).
- Я заключил строку в 50 столбцов для удобства чтения в Stack Overflow. Вы можете перенести его на любое количество столбцов (или не переносить его вообще), и он все равно будет работать.
Теперь, чтобы загрузить это в MySQL:
INSERT INTO my_table (text) VALUES (FROM_BASE64(‘ SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K ‘));
Это будет вставлено без каких-либо жалоб, и вам не нужно было вручную экранировать текст внутри строки.
Литералом (literal) называется значение, с которым не связан идентификатор; оно существует «само по себе». Несколько примеров литералов, которые могут встретиться в программе PL/SQL:
Суффикс «f» в числовом литерале 3.14159f обозначает 32-разрядное вещественное число в стандарте IEEE 754, частично поддерживаемом Oracle, начиная с версии 10g Release 1. Аналогичным образом, 7D — число 7, представленное в 64-разрядном вещественном формате.
О строке q'!hello!' следует упомянуть особо. Знак ! — пользовательский ограничитель (возможность использования пользовательских ограничителей также появилась в Oracle10g). Начальная буква q и одинарные кавычки, в которые заключено значение, сообщают компилятору, что ! — ограничитель, а не часть значения, а строка содержит просто слово hello.
Тип данных INTERVAL предназначен для работы с интервалами между определенными датами или моментами времени. Первый интервал в приведенном выше примере означает «через 25 лет и еще 6 месяцев», а второй — «на 18 месяцев ранее».
Хотя интервалы могут задаваться в литеральном формате, для типов DATE такая возможность не предусмотрена; скажем, значение '01-OCT-1986' интерпретируется как строка, а не как тип Oracle DATE. Да, PL/SQL или SQL могут неявно преобразовать строку '01- OCT-1986' во внутренний формат даты Oracle1, но обычно в программном коде следует выполнять явные преобразования с использованием встроенных функций. Пример:
Оба выражения возвращают время 00:00:00 1 октября 1986 года; первое относится к типу данных DATE, а второе — к типу данных временного штампа с часовым поясом. Во второе выражение также включена информация о часовом поясе (–6 — смещение в часах от общемирового времени GMT (UCT)).
В отличие от идентификаторов строковые литералы PL/SQL чувствительны к регистру символов. Как и следовало ожидать, следующие два литерала различаются:
А проверка следующего условия возвращает FALSE:
Отсутствие значения представляется в Oracle ключевым словом NULL. Как показано в предыдущем разделе, переменные почти всех типов данных PL/SQL могут существовать в состоянии NULL (исключение составляют только ассоциативные массивы, экземпляры которых всегда отличны от NULL). Правильная обработка переменных со значением NULL и так является непростой задачей для программиста, а NULL-строки вдобавок требуют особого обращения.
В Oracle SQL и PL/SQL NULL-строка обычно неотличима от литерала из нуля символов, буквально представляемого в виде '' (две одинарные кавычки, между которыми нет ни одного символа). Например, следующее условие равно TRUE как в SQL, так и в PL/SQL:
Если в PL/SQL переменной VARCHAR2(n) присваивается строка нулевой длины, то результат также считается равным NULL:
Такое поведение соответствует правилам обработки столбцов VARCHAR2 в таблицах баз данных.
Но с данными типа CHAR дело обстоит сложнее. Если создать в PL/SQL переменную типа CHAR(n) и присвоить ей строку нулевой длины, база данных дополняет пустую переменную пробелами, в результате чего она становится отличной от NULL:
Как ни странно, такое поведение проявляется только в PL/SQL. В базе данных при вставке строки нулевой длины в поле типа CHAR(n) содержимое столбца не дополняется пробелами, а остается равным NULL!
В этих примерах проявляется частичная поддержка Oracle версий 92 и 99 стандарта ANSI SQL, согласно которому строка нулевой длины должна отличаться от NULL-строки. По утверждениям Oracle, стандарт будет полностью поддерживаться в будущих версиях. Впрочем, разговоры на эту тему идут уже 15 лет и пока этого не произошло.
База данных пытается неявно преобразовать NULL к типу значения, необходимому для текущей операции. Время от времени может возникнуть необходимость в выполнении явных преобразований с использованием синтаксических конструкций вида TO_NUMBER(NULL) или CAST(NULL AS NUMBER).
SQL-Ex blog
Одной из моих любимых команд SQL являлась QUOTENAME. При программировании генерации кода обычно возникает необходимость заключать строковое значение в кавычки и экранировать любые символы, совпадающие с теми, которыми вы ограничиваете строку, их удвоением. (А если у вас пара таких символов в строке, вам их потребуется уже четыре.) Например, чтобы взять следующую строку в одинарные кавычки (‘):
Чтобы иметь возможность использовать её в динамическом операторе или объявлении переменной, потребуется удвоить одинарную кавычку в строке:
Или, если вы Rob Volk (@sql_r на Twitter), и хотите создать раздражающую базу данных на вашем лучшем заклятом SQL Server, то, чтобы включить скобки в имя базы типа:
вам придется сделать так:
Удваивается закрывающая скобка, но не открывающая. Для экранирования можно использовать QUOTENAME. Параметрами этой функции являются строка и разделитель. По умолчанию удваивается скобка как у большинства имён SQL Server, хотя вы можете использовать любой символ для удвоения. Так для нашей строки:
Этот код вернет
Кажется, работает отлично, поэтому вы чувствуете, что, если вам потребуется нагенерировать некоторый код, вы сможете поступить так:
Выполните этот запрос в Management Studio. Вы увидите на вкладке результата строку, начинающуюся с приведенного выше текста. Проблема состоит в том, что QUOTENAME предназначена для закавычивания значений имен SQL Server, а поскольку в SQL Server имена не могут быть длиннее, чем 128 символов. на входе должно быть не более 128 символов (ниже покажем, что может быть и больше). Итак:
Когда вход превышает 128 символов, возвращается NULL без каких либо предупреждений. Это, мягко говоря, не то, что вы хотели. В моем случае я разработал генератор скрипта расширенных свойств, который принимает значение типа sql_variant и преобразует его к nvarchar(max). Я не тестировал входы, превышающие 128 символов, но коллега любезно предоставил мне строку размером порядка 8000 символов. К счастью, это не был рабочий сервер, где бы безостановочно звонил телефон поддержки.
Итак, я могу предложить использование QUOTENAME в рабочем коде только для квотирования реальных имен операторов SQL, и использовать более неуклюжий метод для других целей:
Этот код демонстирует один и тот же результат для обоих вариантов.
Следует заметить, что это (как и любая простая повторно исполняемая скалярная функция) просится для использования в качестве пользовательской функции. В версиях, предшествующих 2019, всегда однозначно советовали избегать их, т.к. они, мягко говоря, ограничивали производительность. В одних случаях падение производительности было незначительным, в других — существенными провалами. В SQL Server 2019 Microsoft изменила механизм выполнения некоторых скалярных функций, который будет "встраивать" код функции в план запроса, использующего эту функцию. В результате производительность, полученная для перекодируемого оператора и при использовании функции соизмеримы (даже для довольно сложных функций!).
Построим, например, в базе данных WideWorldImporters следующую функцию:
Выполнить функцию можно так:
И вы можете проверить, встраивается ли она, таким образом:
Этот запрос для нашей новой функции возвращает 1.
Встраиваемая или нет, вы не увидите каких либо изменений в этом простом примере — я просто хотел указать на это как на более ценную возможность в будущем. Подробнее о встраиваемых функциях смотрите в публикации Brent Ozar’а.
Наконец, давайте взглянем на немного туповатый трюк, который в целом полезен для определения того, наколько длинной может быть заковыченная строка. Меня интересует, какого максимального размера может быть вывод функции QUOTENAME. Если вы выполните следующий оператор:
вернет []]]]], что на 2 символа больше, чем исходная строка. Если у нас 128 символов ], мы должны получить SELECT 127*2+4 или 258 символов, которые должен вывести следующий оператор.
Мы могли бы это просто прочитать в документации о QUOTENAME, где говорится о результате nvarchar(258)! Следовательно, вот какого размера должна быть переменная/столбец, чтобы ее можно было обработать с помощью функции EscapeString:
Здесь максимальная длина — это не 2 миллиарда как у varchar(max), а максимальная длина, которую может иметь ваш источник данных. Конечно, когда вы используете это значение со всеми экранированными строками, оно будет выглядеть больше, чем результирующее значение, но просто потому, что нам требуется пространство для 258 символов на имя, что не означает, что нам требуется именно 258 символов. Это просто еще одно препятствие, с которым вы столкнетесь, строя пуленепробиваемый генератор кода.
Одинарные кавычки внутри строки
Неприятная сторона работы со строковыми литералами проявляется тогда, когда вам нужно включить в строку одинарную кавычку. До выхода Oracle10g одна литеральная кавычка внутри строки обозначалась удвоением символа кавычки. Примеры:
Литерал (с ограничителем по умолчанию) | Фактическое значение |
'There''s no business like show business.' | There's no business like show business. |
'"Hound of the Baskervilles"' | "Hound of the Baskervilles" |
'''' | ' |
'''hello''' | 'hello' |
'''''' | '' |
Например, из этих примеров следует, что для представления литерала из двух одиночных кавычек требуется целых шесть символов. Для упрощения подобных конструкций в Oracle10g появились специальные ограничители. Литерал начинается с символа q, а выражение в ограничителях заключается в одиночные кавычки. В следующей таблице приведены примеры использования этого синтаксиса.
Литерал (со специальными ограничителями) | Фактическое значение |
q' ( There's no business like show business.) ' | There's no business like show business. |
q' < "Hound of the Baskervilles" >' | "Hound of the Baskervilles" |
q' [ ' ] ' | ' |
q' !'hello' ! ' | 'hello' |
q' |'' | ' | '' |
Как видно из примеров, вы можете использовать как простые ограничители (!, | и т. д.), так и «парные»: левая и правая круглые, фигурные и квадратные скобки.
Напоследок следует заметить, что символ двойной кавычки в строковых литералах не имеет специального значения, а интерпретируется так же, как буква или цифра.
Числовые литералы
Числовые литералы могут быть целыми или действительными (то есть содержащими дробную часть) числами. Заметьте, что PL/SQL рассматривает число 154.00 как действительное, хотя его дробная часть равна нулю и с точки зрения математики оно является целым. Целые и действительные числа имеют разное внутреннее представление, и преобразование числа из одной формы в другую требует определенных ресурсов.
Для определения числовых литералов может использоваться экспоненциальная (научная) запись. Буква E (в верхнем или нижнем регистре) обозначает степень 10 (например, 3.05E19, 12e–5).
Начиная с версии Oracle Database 10g, вещественные числа могут представляться как типом Oracle NUMBER, так и стандартным типом IEEE 754 с плавающей точкой. К последней категории относятся типы BINARY (32-разрядное; обозначается суффиксом F) и BINARY DOUBLE (64 разрядное; обозначается суффиксом D).
В соответствии со стандартом IEEE, в некоторых выражениях могут использоваться именованные константы из следующей таблицы.
Описание | BINARY (32-разрядное) | BINARY DOUBLE (64-разрядное) |
«Не число» (NaN, Not a Number): результат деления на 0 или недействительной операции | BINARY_FLOAT_NAN | BINARY_DOUBLE_NAN |
Положительная бесконечность | BINARY_FLOAT_INFINITY | BINARY_DOUBLE_INFINITY |
Абсолютное наибольшее число, которое может быть представлено | BINARY_FLOAT_MAX_NORMAL | BINARY_DOUBLE_MAX_NORMAL |
Наименьшее нормальное число; порог потери значимости | BINARY_FLOAT_MIN_NORMAL | BINARY_DOUBLE_MIN_NORMAL |
Наибольшее положительное число, меньшее порога потери значимости | BINARY_FLOAT_MAX_SUBNORMAL | BINARY_DOUBLE_MAX_SUBNORMAL |
Абсолютное наименьшее число, которое может быть представлено | BINARY_FLOAT_MIN_SUBNORMAL | BINARY_DOUBLE_MIN_SUBNORMAL |
Логические (булевские) литералы
Для представления логических значений в PL/SQL определено два литерала: TRUE и FALSE. Это не строки и их не нужно заключать в кавычки. Они используются для присваивания значений логическим переменным, как в следующем примере:
При проверке логического значения литерал можно не указывать — тип переменной говорит сам за себя:
Логическое выражение, переменная или константа также могут быть равны NULL — неопределенному значению, которое не является ни TRUE, ни FALSE.
Как в Oracle PL / SQL избежать одиночной кавычки в строке? Я пробовал вот так, не работает.
Вы можете использовать буквальные кавычки:
Документацию для литералов можно найти здесь .
В качестве альтернативы вы можете использовать две кавычки для обозначения одинарной кавычки:
Механизм буквальных кавычек с синтаксисом Q более гибкий и читаемый, IMO.
Самый простой и наиболее часто используемый способ - использовать одинарные кавычки с двумя одинарными кавычками> с обеих сторон.
ВЫБЕРИТЕ 'тестовую одинарную кавычку' '' из двойного;
Результатом вышеупомянутого оператора будет:
тестовая одинарная кавычка '
Просто укажите, что вам требуется дополнительный символ одиночной кавычки для печати символа одиночной кавычки>. То есть, если вы поместите два символа одинарной кавычки, Oracle напечатает один. Первый> действует как escape-символ.
Это самый простой способ вывода одинарных кавычек в Oracle. Но это станет> сложным, если вам нужно будет напечатать набор кавычек вместо одной. В этой> ситуации следующий метод работает нормально. Но для этого требуется больше печатать.
В дополнение к ответу DCookie выше, вы также можете использовать chr (39) для одинарной кавычки.
Я считаю это особенно полезным, когда мне нужно создать ряд операторов вставки / обновления на основе большого количества существующих данных.
Вот очень быстрый пример:
Допустим, у нас есть очень простая таблица Customers, в которой есть 2 столбца: FirstName и LastName. Нам нужно переместить данные в Customers2, поэтому нам нужно сгенерировать несколько операторов INSERT.
Я обнаружил, что это очень полезно при перемещении данных из одной среды в другую или при быстром восстановлении среды.
EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')' ; работал у меня. закрытие varchar / string с двумя парами одинарных кавычек помогло. Другой вариант мог бы использовать using ключевое слово, EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002' ; using Ключевое слово Remember не будет работать, если вы используете EXECUTE IMMEDIATE DDL для выполнения с параметрами, однако использование кавычек будет работать для DDL.
Символьная функция получает в качестве параметра одно или несколько символьных значений и возвращает символьное и числовое значение. Если символьная функция возвращает символьное значение, оно всегда имеет тип VARCHAR2 (переменная длина) — кроме функций UPPER и LOWER . Эти функции преобразуют заданную строку к верхнему или нижнему регистру соответственно и возвращают значение фиксированной длины типа CHAR , если переданные в аргументах строки имели тип CHAR .
Краткая сводка строковых функций
Как упоминалось ранее, PL/SQL предоставляет в распоряжение программиста широкий набор мощных, высокоуровневых строковых функций для получения информации о строках и модификации их содержимого. Следующий список дает представление об их возможностях и синтаксисе. За полной информацией о конкретных функциях обращайтесь к справочнику Oracle SQL Reference.
- ASCII(символ ) Возвращает числовой код (NUMBER) представления заданного символа в наборе символов базы данных.
- ASCIISTR(строка1) Получает строку в любом наборе символов и преобразует ее в строку ASCII-символов. Все символы, отсутствующие в кодировке ASCII, представляются в форме \XXXX, где XXXX — код символа в Юникоде.
- CHR(код)
Возвращает символ типа VARCHAR2 (длина 1), соответствующий заданному коду. Функция является обратной по отношению к функции ASCII. У нее имеется разновидность, удобная при работе с данными в национальных наборах символов:
Возвращает символ типа NVARCHAR2 из национального набора символов.
- COMPOSE(строка1)
Получает строку символов в формате Юникода и возвращает ее в нормализованном виде. Например, ненормализованное представление 'a\0303' определяет символ ' a ' с тильдой cверху (то есть a). Вызов COMPOSE('a\0303') возвращает значение ' \00E3' — шестнадцатеричный код символа a в Юникоде.
В Oracle9i Release 1 функция COMPOSE могла вызываться только из SQL-команд; в программах PL/SQL она использоваться не могла. Начиная с Oracle9i Release2, функция COMPOSE также может использоваться в выражениях PL/SQL.
- CONCAT(строка1, строка2)
Присоединяет строку2 в конец строки1. Аналогичного результата можно добиться при помощи выражения строка1 || строка2. Оператор || намного удобнее, поэтому функция CONCAT используется относительно редко. - CONVERT(строка1, набор_символов)
Преобразует строку из набора символов базы данных в заданный набор символов. При вызове также можно задать исходный набор символов:
CONVERT(строка1, конечный_набор, исходный_набор)
- DECOMPOSE(строка1)
Получает строку в Юникоде и возвращает строку, в которой все составные символы разложены на элементы. Функция является обратной по отношению к COMPOSE . Например, вызов DECOMPOSE ('a') возвращает строку ' a ~' (см. описание COMPOSE ).
Существует две разновидности этой функции:
- DECOMPOSE(строка1 CANONICAL)
Выполняет каноническую декомпозицию; полученный результат может быть восстановлен вызовом COMPOSE . Используется по умолчанию. - DECOMPOSE(строка1)
Декомпозиция выполняется в так называемом режиме совместимости. Восстановление вызовом COMPOSE может оказаться невозможным.
Функция DECOMPOSE , как и COMPOSE , не может напрямую вызываться в выражениях PL/SQL в Oracle9i Release 1; ее необходимо вызывать из инструкций SQL. Начиная с Oracle9i Release 2, это ограничение было снято.
Существует несколько разновидностей этой функции:
- INSTR(строка1, строка2, начальная_позиция)
Поиск строки2 в строке1 начинается с позиции, заданной последним параметром. По умолчанию поиск начинается с позиции 1, так что вызов INSTR(string1, string2, 1 ) эквивалентен вызову INSTR(string1, string2) . - INSTR(строка1, строка2, отрицательная_начальная_позиция)
Смещение начальной позиции задается не от начала, а от конца строки1. - INSTR(строка1, строка2, начальная_позиция, n )
Находит n-е вхождение строки2, начиная с заданной начальной позиции. - INSTR(строка1, строка2, отрицательная_начальная_позиция, n)
Находит n-е вхождение строки2, начиная с заданной начальной позиции от конца строки1.
Функция INSTR рассматривает строку как последовательность символов. Ее разновидности INSTRB, INSTR2 и INSTR4 рассматривают строку как последовательность байтов, кодовых единиц (code units) или кодовых индексов (code points) Юникода соответственно. Разновидность INSTRC рассматривает строку как последовательность полных символов Юникода. Например, строка 'a\0303' , которая представляет собой разложенный эквивалент '\00E3', или a , рассматривается как один символ. Напротив, функция INSTR рассматривает 'a\0303 ' как последовательность из двух символов.
- LEAST(строка1, строка2, . )
Получает одну или несколько строк и возвращает строку, которая оказалась бы первой (то есть наименьшей) при сортировке входных строк по возрастанию. Также см. описание функции GREATEST , обратной по отношению к LEAST . - LENGTH(строка1)
Возвращает количество символов в строке. Разновидности LENGTHB, LENGTH2 и LENGTH4 возвращают количество байтов, кодовых единиц (code units) или кодовых индексов (code points) Юникода соответственно. Разновидность LENGTHC возвращает количество полных символов Юникода, нормализованных по мере возможности (то есть с преобразованием 'a\0303 ' в '\00E3' ).
Функция LENGTH обычно не возвращает нуль. Вспомните, что Oracle рассматривает пустую строку ('') как NULL , поэтому вызов LENGTH ('') фактически эквивалентен попытке получить длину NULL ; ее результат тоже будет равен NULL . Единственное исключение встречается при применении LENGTH к типу CLOB . Тип CLOB может содержать 0 байт и при этом быть отличным от NULL . В этом единственном случае LENGTH возвращает 0.
- LOWER(строка1)
Преобразует все буквы заданной строки в нижний регистр. Функция является обратной по отношению к UPPER . Тип возвращаемого значения соответствует типу входных данных ( CHAR ,VARCHAR2, CLOB ). Также см. NLS_LOWER . - LPAD(строка1, итоговая_длина)
Возвращает значение строки1, дополненное слева пробелами до итоговой_длины . У функции существует следующая разновидность: - LPAD(строка1, итоговая_длина, заполнитель)
Присоединяет достаточное количество полных или частичных вхождений заполнителя, чтобы общая длина строки достигла заданной итоговой_длины . Например, вызов LPAD ( 'Merry Christmas!', 25, 'Ho! ') вернет результат ' Ho! Ho! HMerry Christmas!'.
- ?LTRIM(строка1)
Удаляет пробелы с левого края строки1. Также см. описания функций TRIM (стандарт ISO) и RTRIM . У функции существует следующая разновидность: - LTRIM(строка1, удаляемый_набор)
Удаляет любые символы, входящие в строку удаляемый_набор , от левого края строки1. - NCHR(код)
Возвращает символ типа NVARCHAR2 (длина 1) , соответствующий заданному коду. Функция CHR с условием USING NCHAR_CS реализует ту же функциональность, что и NCHR . - NLS_INITCAP (строка1)
Возвращает версию строки1, которая должна относиться к типу NVARCHAR2 или NCHAR , в которой первая буква каждого слова переводится в верхний регистр, а остальные буквы — в нижний. Функция возвращает значение типа VARCHAR2 . «Словом» считается последовательность символов, отделенная от остальных символов пробелом или символом, не являющимся буквенно-цифровым.
Вы можете задать порядок сортировки, влияющий на определение «первой буквы»:
- NLS_INITCAP(строка1, 'NLS_SORT=правило_сортировки')
В этой форме синтаксиса правило_сортировки представляет собой одно из допустимых названий правил сортировки, перечисленных в руководстве Oracle Database Globalization Support Guide, Appendix A, раздел «Linguistic Sorts».
Следующий пример показывает, чем функция INITCAP отличается от NLS_INITCAP :
В нидерландском языке последовательность символов « ? » рассматривается как один символ. Функция NLS_INITCAP распознает это обстоятельство при задании правила NLS_SORT и правильно преобразует символы слова « ?zer » («железо» по-нидерландски).
- NLS_LOWER(строка1) и NLS_LOWER(строка1, 'NLS_SORT=правило_сортировки ') Возвращает строку1, преобразованную в нижний регистр по правилам заданного языка. О том, как NLS_SORT может повлиять на результат преобразования, рассказано в описании функции NLS_INITCAP .
- NLS_UPPER(строка1) и NLS_UPPER(строка1, 'NLS_SORT=правило_сортировки') Возвращает строку1, преобразованную в верхний регистр по правилам заданного языка. О том, как NLS_SORT может повлиять на результат преобразования, рассказано в описании функции NLS_INITCAP .
- NLSSORT(строка1) и NLSSORT(строка1, 'NLS_SORT=правило_сортировки ') Возвращает строку байтов, которая может использоваться для сортировки строкового значения по правилам заданного языка. Строка возвращается в формате RAW . Например, сравнение двух строк по правилам французского языка выполняется так: IF NLSSORT(x, 'NLS_SORT=XFRENCH') > NLSSORT(y, 'NLS_SORT=XFRENCH') THEN. Если второй параметр не указан, функция использует порядок сортировки по умолчанию, назначенный для сеанса. Полный список правил приведен в руководстве Oracle Database Globalization Support Guide, Appendix A, раздел «Linguistic Sorts».
- REGEXP_COUNT, REGEXP_INSTR, REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR За описаниями этих функций, предназначенных для работы с регулярными выражениями, можно изучить эту статью.
- REPLACE(строка1, искомая_строка, замена) Возвращает строку, полученную в результате замены всех вхождений искомой_строки в строке1 строкой замена. Функция REPLACE может использоваться для замены всех вхождений определенной подстроки в одной инструкции.
- REPLACE(строка1, искомая_строка)
Возвращает строку, полученную в результате удаления всех вхождений искомой_строки из строки1. - RPAD(строка1, итоговая_длина)
Возвращает значение строки1, дополненное справа пробелами до итоговой_длины . У функции существует следующая разновидность: - RPAD(строка1, итоговая_длина, заполнитель)
Присоединяет достаточное количество полных или частичных вхождений заполнителя, чтобы общая длина строки достигла заданной итоговой_длины . Вызов RPAD('Merry Christmas!', 25, 'Ho! ') вернет результат 'Merry Christmas! Ho! Ho!'.
Функция RPAD дополняет строку справа, а парная ей функция LPAD — слева.
- RTRIM(строка1)
Удаляет пробелы с правого края строки1. Также см. описания функций TRIM (стандарт ISO) и LTRIM . У функции существует следующая разновидность: - RTRIM(строка1, удаляемый_набор)
Удаляет любые символы, входящие в строку удаляемый_набор , с правого края строки1. - SOUNDEX(строка1)
Возвращает строку с «фонетическим представлением» аргумента.
Пример:
При использовании функции SOUNDEX следует помнить несколько правил:
- Значение SOUNDEX всегда начинается с первой буквы входной строки.
- Возвращаемое значение генерируется только по первым пяти согласным в строке.
- Для вычисления цифровой части SOUNDEX используются только согласные. Все гласные в строке, кроме начальных, игнорируются.
- Функция SOUNDEX игнорирует регистр символов; для букв верхнего и нижнего регистра генерируются одинаковые значения SOUNDEX .
Функция SOUNDEX полезна для запросов, при которых точное написание значения в базе данных неизвестно или не может быть легко определенно.
Алгоритм SOUNDEX ориентирован на английский язык; в других языках он может работать плохо (или не работать вообще).
- SUBSTR(строка1, начальная_позиция, длина)
Возвращает подстроку из строки1, которая начинается с начальной_позиции и имеет заданную длину. Если количество символов до конца строки1 окажется меньше длины, возвращаются все символы от начальной позиции до конца строки. У функции существуют следующие разновидности: - SUBSTR(строка1, начальная_позиция)
Возвращает все символы от начальной_позиции до конца строки1. - SUBSTR(строка1, отрицательная_начальная_позиция, длина)
Начальная позиция подстроки отсчитывается от конца строки1. - SUBSTR(строка1, отрицательная_начальная_позиция)
Возвращает последние ABS( отрицательная_начальная_позиция ) строки.
Функция SUBSTR рассматривает строку как последовательность символов. Ее разновидности SUBSTRB, SUBSTR2 и SUBSTR4 рассматривают строку как последовательность байтов, кодовых единиц (code units) или кодовых индексов (code points) Юникода соответственно. Разновидность SUBSTRC рассматривает строку как последовательность полных символов Юникода. Например, строка 'a\0303' , которая представляет собой разложенный эквивалент '\00E3' , или a , рассматривается как один символ. Напротив, функция SUBSTR рассматривает 'a\0303' как последовательность из двух символов.
- TO_CHAR(национальные_символьные_данные)
Преобразует данные из национального набора символов в эквивалентное представление в наборе символов базы данных. Также см. TO_NCHAR .
Функция TO_CHAR также может использоваться для преобразования даты/ времени и чисел в удобочитаемую форму.
- TO_MULTI_BYTE(строка1)
Преобразует однобайтовые символы в их многобайтовые эквиваленты. В некоторых многобайтовых кодировках, и прежде всего UTF-8, может существовать несколько вариантов представления одного символа. Скажем, в UTF-8 представление буквы 'G' может содержать от 1 до 4 байт. Для перехода от однобайтового представления к многобайтовому используется функция TO_MULTI_BYTE . Данная функция является обратной по отношению к TO_SINGLE_BYTE . - TO_NCHAR(символы_в_наборе_базы_данных)
Преобразует данные из набора символов базы данных в эквивалентное представление в национальном наборе символов. Также см. TO_CHAR и TRANSLATE. USING.
Функция TO_NCHAR также может использоваться для преобразования даты/времени и чисел в удобочитаемую форму.
- TO_SINGLE_BYTE(строка1)
Преобразует многобайтовые символы в их однобайтовые эквиваленты. Функция является обратной по отношению к TO_MULTI_BYTE . - TRANSLATE(строка1, искомый_набор, набор_замены)
Заменяет в строке1 каждое вхождение символа из искомого_набора соответствующим символом набора_замены . Пример:
Если искомый_набор содержит больше символов, чем набор_замены , «лишние» символы, не имеющие соответствия в наборе_замены , не включаются в результат. Пример:
Буква « d » удалена, потому что она присутствует в искомом_наборе , но не имеет эквивалента в наборе_замены . Функция TRANSLATE заменяет отдельные символы, а функция REPLACE — целые строки.
- TRANSLATE(текст USING CHAR_CS) и TRANSLATE(текст USING NCHAR_CS)
Преобразует символьные данные в набор символов базы данных ( CHAR_CS ) или в национальный набор символов ( NCHAR_CS ). Выходным типом данных будет VARCHAR2 или NVARCHAR2 в зависимости от того, выполняется ли преобразование к набору символов базы данных или национальному набору символов соответственно.
Функция TRANSLATE. USING входит в число функций SQL по стандарту ISO. Начиная с Oracle9i Release 1, можно просто присвоить значение VARCHAR2 переменной типа NVARCHAR2 , и наоборот — система неявно выполнит нужное преобразование. Если же вы хотите выполнить преобразование явно, используйте функции TO_CHAR и TO_NCHAR для преобразования текста в набор символов базы данных и национальный набор символов соответственно. Oracle рекомендует пользоваться указанными функциями вместо TRANSLATE. USING , потому что они поддерживают более широкий набор входных типов данных.
- TRIM(FROM строка1)
Возвращает строку, полученную в результате удаления из строки1 всех начальных и конечных пробелов. У функции существуют следующие разновидности: - TRIM(LEADING FROM . )
Удаление только начальных пробелов. - TRIM(TRAILING FROM . )
Удаление только конечных пробелов. - TRIM(BOTH FROM . )
Удаление как начальных, так и конечных пробелов (используется по умолчанию). - TRIM (. удаляемый_символ FROM строка1)
Удаление вхождений одного удаляемого_символа на выбор программиста.
Функция TRIM была включена в Oracle8i для обеспечения более полной совместимости со стандартом ISO SQL. Она сочетает в себе функциональность LTRIM и RTRIM , но отличается от них тем, что TRIM позволяет задать только один удаляемый символ, тогда как при использовании LTRIM и RTRIM можно задать набор удаляемых символов.
- UNISTR(строка1)
Возвращает строку1, преобразованную в Юникод; таким образом, функция является обратной по отношению к ASCIISTR . Для представления непечатаемых символов во входной строке можно использовать запись \XXXX, где XXXX — кодовый индекс символа в Юникоде. Пример:
Функция предоставляет удобный доступ ко всему набору символов Юникода, в том числе и к тем, которые не могут вводиться непосредственно с клавиатуры.
Читайте также: