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
'programing' 카테고리의 다른 글
보다 더 좋은 것.NET 리플렉터? (0) | 2023.05.02 |
---|---|
git 디렉토리의 모든 확장자 파일 무시 (0) | 2023.05.02 |
mongo의 하위 문서 색인 (0) | 2023.05.02 |
날짜 시간 필드별 최신 MongoDB 레코드 가져오기 (0) | 2023.05.02 |
MongoDB에서 $set을 사용하여 중첩된 값/포함된 문서를 업데이트하는 방법은 무엇입니까? (0) | 2023.05.02 |