:: Не фоксом единым
Firebird, кавычки в литерале
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
Добрый день,

помогите разобраться с кавычками в ФБ, диалект 3.

Нужно получить строку следующего вида:
LASTNAME 'что-то тут'

значение что-то тут передается как параметр
получается:
lclastname = ' LASTNAME ' || '' || trim(:tcnalast) || ''''

Почему 4-ре апострофа в конце? Получил, что называется подбором, почему так - не понимаю.
код
lclastname = ' LASTNAME ' || Q'[']' || trim(:tcnalast) || Q'[']'
не работает.



Исправлено 2 раз(а). Последнее : DmitryKn, 03.05.23 15:01
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
AndyNigmatec

Сообщений: 1551
Откуда: Волгоград
Дата регистрации: 28.06.2015
ну все просто, я же говорил уже )))

вот ваша строка:
lclastname = ' LASTNAME ' || '' || trim(:tcnalast) || ''''

значение в переменной lclastname (для конкретности пусть tcnalast='USER'):

LASTNAME USER'

поскольку кавычками обрамляется строка, то для использования одинарной кавычки внутри строки ее (эту кавычку) надо экранировать еще одной одинарной:

lclastname = ' LASTNAME ''' || trim(:tcnalast) || ''''

значение:

LASTNAME 'USER'



Исправлено 3 раз(а). Последнее : AndyNigmatec, 03.05.23 16:19
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
AndyNigmatec
ну все просто, я же говорил уже )))

поскольку кавычками обрамляется строка, то для использования одинарной кавычки внутри строки ее (эту кавычку) надо экранировать еще одной одинарной:

lclastname = ' LASTNAME ''' || trim(:tcnalast) || ''''

значение:

LASTNAME 'USER'

Да, и то же самое в руководстве по языку. Но вот после lastname стоит 3 апострофа, после параметра - 4. Каков принцип? вот LASTNAME литерал, его обрамили по 1-му апострофу. Потом добавили кавычку - ||'' один апостроф экранирует, второй - кавычка. Т.е. всего после LASTNAME 3 апострофа, это еще как-то. А почему после параметра 4-ре? По логике 2 нужно.
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
AndyNigmatec

Сообщений: 1551
Откуда: Волгоград
Дата регистрации: 28.06.2015
DmitryKn
Потом добавили кавычку - ||'' один апостроф экранирует, второй - кавычка. Т.е. всего после LASTNAME 3 апострофа, это еще как-то. А почему после параметра 4-ре? По логике 2 нужно.
- нет, вы не так все поняли )))
оператор || - это соединение строк, т.е. в фоксе мы пишем строка1 + строка2, а здесь строка1 || строка2

в итоге вы получаете:
DmitryKn
lclastname = ' LASTNAME ' || ''
к строке ' LASTNAME ' вы прибавили просто пустую строку, никакого экранирования здесь нет (экранирование сработает внутри выражения выделенного одинарными кавычками)

далее вы к этому выражению добавляете:
DmitryKn
|| trim(:tcnalast) || ''''

вот тут и срабатывает экранирование, в итоге ваше выражение
DmitryKn
lclastname = ' LASTNAME ' || '' || trim(:tcnalast) || ''''

запишет в lclastname: LASTNAME USER' (для конкретности принял tcnalast='USER')

если в lclastname вам нужно обрамление USER кавычками - то нужно и слева добавить как я и написал выше

lclastname = ' LASTNAME ''' || trim(:tcnalast) || ''''

или почти по вашему

lclastname = ' LASTNAME ' || '''' || trim(:tcnalast) || ''''

и в том и другом случае в итоге вы получите требуемое - LASTNAME 'USER'



Исправлено 2 раз(а). Последнее : AndyNigmatec, 04.05.23 09:31
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
Скорее всего, либо в приведенном примере ошибка, либо подставляемая переменная внутри себя содержит ведущую кавычку. Лично я "прочитал" первоначальную строку так

Текст = "Текстовая константа" + "пробел" + "значение переменной" + "закрывающая кавычка"

Что в результате исходной строки получается-то? Там есть открывающая кавычка в результирующей строке?
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
AndyNigmatec

Сообщений: 1551
Откуда: Волгоград
Дата регистрации: 28.06.2015
так и я о том же )))

с той лишь разницей что пробела не увидел, увидел так исходный пример:

Текст = "Текстовая константа" + "" + "значение переменной" + "закрывающая кавычка"
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
AndyNigmatec

Сообщений: 1551
Откуда: Волгоград
Дата регистрации: 28.06.2015
Судя по использованию LASTNAME - ТС добавляет/меняет пользователя в FB из процедуры/приложения - значит тут одинарные кавычки должны быть с обоих сторон
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
Так, стало еще хуже..

AndyNigmatec
lclastname = ' LASTNAME ' || '''' || trim(:tcnalast) || ''''

здесь LASTNAME я специально отделил в строку, что бы понятнее (мне) было. Так почему их, апострофов 4-ре , а в сумме с предыдущей строкой 5 ?
а здесь 3 ?
AndyNigmatec
lclastname = ' LASTNAME ''' || trim(:tcnalast) || ''''
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
AndyNigmatec

Сообщений: 1551
Откуда: Волгоград
Дата регистрации: 28.06.2015
так где ж их три то, считайте - lclastname = ' LASTNAME ''' - я вижу 4
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
Владимир Максимов
Скорее всего, либо в приведенном примере ошибка, либо подставляемая переменная внутри себя содержит ведущую кавычку. Лично я "прочитал" первоначальную строку так
Текст = "Текстовая константа" + "пробел" + "значение переменной" + "закрывающая кавычка"

Что в результате исходной строки получается-то? Там есть открывающая кавычка в результирующей строке?

Переменная кавычку не содержит, конечно. Но вот такой код работает.

DmitryKn
lclastname = ' LASTNAME ' || '' || trim(:tcnalast) || ''''
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
AndyNigmatec
так где ж их три то, считайте - lclastname = ' LASTNAME ''' - я вижу 4

я имел ввиду одну перед литералом, и 3 после. ....NAME' ' ' - вот здесь 3 почему?



Исправлено 1 раз(а). Последнее : DmitryKn, 04.05.23 09:51
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
AndyNigmatec

Сообщений: 1551
Откуда: Волгоград
Дата регистрации: 28.06.2015
у вас строка выделяется кавычками - вот и считайте их парно

lclastname = ' LASTNAME ''' - внешние говорят FB что между ними строка, две подряд внутренние преобразуются в один символ - одинарную кавычку
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
AndyNigmatec

Сообщений: 1551
Откуда: Волгоград
Дата регистрации: 28.06.2015
пишите понятно для себя:
так:
lclastname = ' LASTNAME ''' || trim(:tcnalast) || ''''

в переводе на фокс (для понимания)

lclastname = [ LASTNAME '] + alltrim(tcnalast) + [']



Исправлено 1 раз(а). Последнее : AndyNigmatec, 04.05.23 09:56
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
AndyNigmatec
Судя по использованию LASTNAME - ТС добавляет/меняет пользователя в FB из процедуры/приложения - значит тут одинарные кавычки должны быть с обоих сторон

Совершенно верно. И добавляется/меняется, но вот мне потребовалось разбить на строки команду, и я погряз в этих апострофах , не могу суть уловить.
В фоксе понятно, кавычку можно отдельно представить, например так:
... + " ' " + tcnalast + " ' " + ...
А как в ФБ все никак не разберусь.
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
AndyNigmatec
пишите понятно для себя:
так:
lclastname = ' LASTNAME ''' || trim(:tcnalast) || ''''

в переводе на фокс (для понимания)

lclastname = [ LASTNAME '] + alltrim(tcnalast) + [']

Так, с LASTNAME понятно, пара внешних, внутри кавычка и экран. Пара внешних скажет ФБ что внутри строка, а как ФБ поймет, что в переменной строка? Перед ней, получается ничего не стоит , символ кавычка относится к предыдущей строке.
И в конце 4 апострофа как получились?
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
"Вот такой код работает" - это непонятная фраза. Как работает? Мы же не видим, что там у Вас на экране.

Если есть проблемы, то делаются последовательные тесты и смотрят, что там в итоге получается. Возможно, это какая-то фича FireBird. Или, опять же, значение переменной. Вы же упорно не говорите, что там внутри переменной. Может, реально есть ведущая кавычка?

/*
Значение самой переменной
*/
lclastname = trim(:tcnalast)
/*
Сложение без добавление кавычек
*/
lclastname = ' LASTNAME ' || trim(:tcnalast)
/*
Сложение с добавлением только концевых кавычек
*/
lclastname = ' LASTNAME ' || trim(:tcnalast) || ''''
/*
Сложение с добавлением ведущих кавычек внутри текстовой константы
*/
lclastname = ' LASTNAME '' ' || trim(:tcnalast) || ''''
/*
Сложение с добавлением промежуточной пустой строки и текстовой константы
*/
lclastname = ' LASTNAME ' || '' || 'TEST' || ''''
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
AndyNigmatec

Сообщений: 1551
Откуда: Волгоград
Дата регистрации: 28.06.2015
DmitryKn
а как ФБ поймет, что в переменной строка
- тип переменной посмотрит - и не скомпилирует если привести не сможет )))
DmitryKn
И в конце 4 апострофа как получились?
- тут все то же самое - внешние говорят что внутри строка, из двух внутренних апостроф получается
FB: ''''
аналог в фоксе
"'"



Исправлено 1 раз(а). Последнее : AndyNigmatec, 04.05.23 10:08
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
AndyNigmatec

Сообщений: 1551
Откуда: Волгоград
Дата регистрации: 28.06.2015
Владимир Максимов
Возможно, это какая-то фича FireBird. Или, опять же, значение переменной. Вы же упорно не говорите, что там внутри переменной. Может, реально есть ведущая кавычка?

нет, там не может быть кавычек - имена пользователей не допускаются с такими символами
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
AndyNigmatec

Сообщений: 1551
Откуда: Волгоград
Дата регистрации: 28.06.2015
вот прямо сейчас в FB проверил:

' LASTNAME ' || '' || 'TEST' || ''''

дает:

LASTNAME TEST'

т.е. все так как я и написал выше ))

[attachment 36552 p1.png]

[attachment 36553 p2.png]



Исправлено 1 раз(а). Последнее : AndyNigmatec, 04.05.23 10:35
Ratings: 0 negative/0 positive
Re: Firebird, кавычки в литерале
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
AndyNigmatec
Владимир Максимов
Может, реально есть ведущая кавычка?

нет, там не может быть кавычек - имена пользователей не допускаются с такими символами

"Не допускаются", "Не может быть" и "Действительно нет. Я проверил" - это разные понятия.

Как говорится, "доверяй, но проверяй". Если возникла проблема, то следует убедится, что в базе данных не записана кавычка. Т.е. в данном случае нельзя верить на слово. Надо посмотреть "глазами" и убедится, что действительно нет.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 4 (Гостей: 4)

© 2000-2024 Fox Club 
Яндекс.Метрика