AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 333724
Accepted
vfclists
vfclists
Asked: 2023-12-05 00:38:55 +0800 CST2023-12-05 00:38:55 +0800 CST 2023-12-05 00:38:55 +0800 CST

Qual função eu preciso para obter constantes entre aspas simples no SQL gerado? O gerador de código envolve a saída entre aspas simples entre aspas duplas

  • 772

Eu queria criar uma visão que somasse uma tabela comum a vários esquemas, conforme expresso aqui , e incluísse o nome do esquema ou uma expressão derivada como uma coluna, então criei uma visão que inclui o nome do esquema como um valor constante, por usando o quote_literalpara colocar o nome do esquema entre aspas simples.

Pode quote_literalnão ser a função correta aqui, mas tudo o que eu faço fica entre aspas duplas.

CREATE OR REPLACE FUNCTION create_summary_view_quoted(
   created_view text,
   common_view text,
   VARIADIC schemas text[]
) RETURNS text
   LANGUAGE sql AS
$$SELECT format('CREATE VIEW %I AS ', created_view) ||
         string_agg(
            format('SELECT %I as source_schema, * FROM %I.%I ', quote_literal(schemas[i]) , schemas[i], common_view),
            ' UNION ALL '
         )
FROM generate_series(1, cardinality(schemas)) AS i$$;
")

Aplicando-o à consulta

SELECT create_summary_view_quoted('newv', 'oldv', 's1', 's2', 's3');

produz

create view newv as
select
    "'s1'" as source_schema,
    *
from
    s1.oldv
union all
select
    "'s2'" as source_schema,
    *
from
    s2.oldv
union all
select
    "'s3'" as source_schema,
    *
from
    s3.oldv

O problema são as aspas duplas em torno da constante entre aspas simples que faz com que o Postgres trate como um nome de coluna e vomite.

Corrigi o problema de geração de código usando aspas simples duplas no primeiro espaço reservado e descartando a quote_literalfunção,

ou seja, substituir

format('SELECT %I as source_schema, * FROM %I.%I ', quote_literal(schemas[i]) , schemas[i], common_view),

com

format('SELECT ''%I'' as source_schema, * FROM %I.%I ', schemas[i] , schemas[i], common_view),

Meu problema não é tanto, quote_literalmas como a função sempre envolve a saída de qualquer função que envolve uma string entre aspas simples e aspas duplas.

Mesmo quando usei uma função para retirar um sufixo inicial nos nomes dos esquemas porque eles são redundantes, a saída entre aspas simples é colocada entre aspas duplas.

por exemplo, quote_nullable(right(schemas[i],-10))a string resultante fica entre aspas duplas.

Eu poderia aplicar o ||operador em algum lugar, mas prefiro uma função de cotação.

O Postgres não possui uma função integrada de aspas simples?

Há alguma sintaxe SQL necessária que estou faltando?

É uma peculiaridade do Postgres?

postgresql
  • 1 1 respostas
  • 48 Views

1 respostas

  • Voted
  1. Best Answer
    mustaccio
    2023-12-05T10:21:59+08:002023-12-05T10:21:59+08:00

    O %I especificador de tipo de formato diz à format()função para tratar o valor do argumento correspondente como um identificador e, como contém aspas simples (como resultado de quote_literal()), é devidamente colocado entre aspas duplas para torná-lo um identificador válido.

    No entanto, na SELECTlista você deseja que o nome do esquema seja uma string literal simples, portanto o %sespecificador de tipo será apropriado.

    format(
      'SELECT %s as source_schema, * FROM %I.%I ', 
      quote_literal(schemas[i]) ,
      schemas[i],
      common_view
    )...
    

    Talvez você também possa dispensar quote_literal(), se souber a origem dos nomes dos esquemas e tiver certeza de que eles não contêm aspas simples:

    format(
      'SELECT ''%s'' as source_schema, * FROM %I.%I ', 
      schemas[i],
      schemas[i],
      common_view
    )...
    
    • 2

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve