ОШИБКА: столбец «msft» не существует LINE 1: УДАЛИТЬ ОТ «Stock_Profile» ГДЕ «Символ» = MSFT;Почему psql не распознает мои одинарные кавычки?
Как показать psql, что MSFT - это строка?
Это не нравится «MSFT», \ «MSFT \» или «» «» MSFT
ОШИБКА: столбец «msft» не существует LINE 1: УДАЛИТЬ ОТ «Stock_Profile» ГДЕ «Символ» = MSFT;Почему psql не распознает мои одинарные кавычки?
Как показать psql, что MSFT - это строка?
Это не нравится «MSFT», \ «MSFT \» или «» «» MSFT
Проблема заключается в том, что у вас закончились типы знаков кавычек для гнезда; Разрушаяся, у нас есть:
psql
; это может быть либо одинарные кавычки или двойные кавычкиВ примере вы даете:
psql -E --host=xxx --port=yyy --username=chi --dbname=C_DB -c 'DELETE FROM "Stock_Profile" WHERE "Symbol" = 'MSFT'; '
оболочка видит две одинарные кавычки строки:
'DELETE FROM "Stock_Profile" WHERE "Symbol" = '
Так что проблема не в psql, а в самой оболочке.
В зависимости от того, какую оболочку вы используете, строки с одним кавычком, вероятно, не принимают никаких экранов (так что \'
не помогает), но, возможно, делают строки с двумя кавычками. Таким образом, вы можете попробовать использовать двойные кавычки на внешнем запросе, и избежать их вокруг имени таблицы:
psql -E --host=xxx --port=yyy --username=chi --dbname=C_DB -c "DELETE FROM \"Stock_Profile\" WHERE \"Symbol\" = 'MSFT'; "
Теперь \"
не закончится строка, так что оболочка будет рассматривать это как одну строку:
"DELETE FROM \"Stock_Profile\" WHERE \"Symbol\" = 'MSFT'; "
и передать его в PSQL с побеги обработаны, что приводит к желаемому SQL:
DELETE FROM "Stock_Profile" WHERE "Symbol" = 'MSFT';
Это потому, что апостроф перед тем MSFT завершает строку, насколько PSQL обеспокоен.
Поскольку @imsop указывает, что чувствительность к регистру не сохраняется при удалении двойных кавычек из имен таблиц и имен столбцов, чтобы избежать двойных кавычек с обратной косой чертой (\
), когда это необходимо.
psql -E --host=xxx --port=yyy --username=chi --dbname=C_DB -c "DELETE FROM \"Stock_Profile\" WHERE \"Symbol\" = 'MSFT';"
в виде двойной кавычки в данном случае не являются необязательными, предполагая те реальные таблицы и столбца п ames, потому что заглавные буквы будут складываться в нижний регистр и создавать разные имена ('stock_profile' vs' Stock_Profile', 'symbol' vs' Symbol'). Postgres - это случай * чувствительный *, но также случай * складывание *; по-видимому, нечетную комбинацию, и ее можно легко избежать, используя идентификаторы всех строчных регистров. – IMSoP
ОК, всегда называли мои таблицы строчными именами, поэтому я пропустил часть о чувствительности к регистру. Я отредактирую свой ответ и займусь. – kometen