programing

Postgres에서 키워드와 유사한 열 이름 이스케이프

skycolor 2023. 5. 2. 22:32
반응형

Postgres에서 키워드와 유사한 열 이름 이스케이프

Postgres' 테이블의 열에 이름이 있는 경우year어떻게 보일까요?INSERT해당 열의 값을 설정하는 쿼리를 선택하시겠습니까?

예:INSERT INTO table (id, name, year) VALUES ( ... ); 단어에 가까운 오류를 제공합니다.

간단히 동봉year키워드로 해석되지 않도록 큰따옴표로 묶습니다.

INSERT INTO table (id, name, "year") VALUES ( ... );

설명서에서 다음을 참조하십시오.

구분된 식별자 또는 따옴표로 묶인 식별자의 두 번째 종류가 있습니다.임의의 문자 시퀀스를 이중 따옴표(")로 둘러싸서 형성됩니다.구분된 식별자는 항상 식별자이며, 키워드는 아닙니다.따라서 "select"는 "select"라는 이름의 열 또는 테이블을 가리키는 데 사용될 수 있지만, 따옴표로 묶이지 않은 선택은 키워드로 간주되므로 테이블 또는 열 이름이 예상되는 곳에서 사용될 때 구문 분석 오류를 유발합니다.

필드/열에 따옴표를 제공하지 않으면 기본적으로 Postgres로 소문자가 줄어듭니다.그리고 Postgres는 열 이름과 관련하여 키워드 확인을 건너뜁니다.

당신의 경우, 저는 인용문을 추가하는 것이 의무는 아니라고 생각합니다.columns하지만 당신이 사용한다면keywords(Postgres에 의해 등록됨)의 이름으로Table,Schema,Function또는Trigger등, 큰따옴표를 사용하거나 점 연결로 스키마 이름을 지정할 수 있습니다.

Postgres에 등록된 키워드가 순서라고 가정해 보겠습니다.또한 일부 시나리오에서는 이 키워드를 테이블 이름으로 사용해야 합니다.

그 때 Postgres를 사용하여 테이블을 만들 수 있습니다.keywords그것이 Postgres의 아름다움입니다.

주문 테이블에 액세스하려면 이중 따옴표를 사용하거나 테이블 이름 앞에 스키마 이름을 지정할 수 있습니다.

예.

1.

select * from schema_name.order;

2.

select * from "order";

마찬가지로 이러한 유형의 조합을 사용할 수 있습니다.이것이 당신에게 도움이 되기를 바랍니다.

안전한 쪽으로 가기 위해:항상 식별자를 따옴표로 묶습니다!이를 위해 구분된 식별자를 사용하여 삽입 문을 작성해야 합니다.

SQL 2003에서 구분된 식별자를 큰따옴표로 따옴표로 묶어야 함을 지정합니다."그리고 식별자에 이중 따옴표가 발생하면 이중 따옴표를 복제해야 합니다.BNF 참조:

https://ronsavage.github.io/SQL/sql-2003-2.bnf.html#delimited%20identifier

식별자를 따옴표로 묶는 Java 코드입니다.

static String delimited_identifier (String identifier)
{
  return "\"" + identifier.replaceAll ("\"", "\"\"") + "\"";
}

다음은 인서트를 빌드하기 위한 코드입니다.

static String build_insert (String table, String[] columns)
{
  StringBuilder sql = new StringBuilder ();
  StringBuilder values = new StringBuilder ();

  sql.append ("INSERT INTO ");
  sql.append (delimited_identifier (table));
  sql.append (" (");
  int c = 0;
  if (columns.length > 0) {
    sql.append (delimited_identifier (columns[c]));
    values.append ("?");
  }
  for (++c; c < columns.length; c++) {
    sql.append (", ");
    sql.append (delimited_identifier (columns[c]));
    values.append (", ?");
  }
  sql.append (") VALUES (");
  sql.append (values.toString ());
  sql.append (")");

  return sql.toString ();
}

예:

String sql = build_insert ("Person", new String[]{"First name", "Last name"});

언급URL : https://stackoverflow.com/questions/7651417/escaping-keyword-like-column-names-in-postgres

반응형