매직 칼럼“name”은 어디에서 왔습니까?


11

우연히 이것을 얻었습니다.

db=> select name from site;
ERROR:  column "name" does not exist
LINE 1: select name from site;
               ^
db=> select site.name from site;
     name
---------------
 (1,mysitename)
(1 row)

두 번째 쿼리는 전체 행을 포함하는 튜플을 반환합니다. postgres 9.0.1 사용.

편집 : 요청에 의한 사이트 정의. 나는 정말로 중요하지 않습니다.이 별난 것은 어떤 테이블에서도 작동합니다.

db=> \d site
                         Table "public.site"
 Column |  Type   |                     Modifiers
--------+---------+---------------------------------------------------
 id     | integer | not null default nextval('site_id_seq'::regclass)
 title  | text    | not null

의 정의를 표시하면 도움이됩니다 site.
피터 아이젠 트라우트

~는 않습니다 지금 우리가 어떤 "이름"이없는 것을 볼 수 있기 때문에 문제 site로 시작하는이. 존재하지 않는 열을 쿼리하는 이유는 무엇입니까?
jcolebrand

1
시도 select site from site-이 좀 더 자세히 가이오의 답변을 이해하는 데 도움이 될 것입니다
잭은 말한다 topanswers.xyz 시도

답변:


11

NAME실제로 함수 입니다. Postgres의 단점은 하나의 인수가있는 함수를 예를 들어 function(arg)로 호출 할 수 있다는 것 arg.function입니다. 문서에서 :

기능 표기법과 속성 표기법의 동등성은 복합 유형에서 함수를 사용하여 "계산 된 필드"를 에뮬레이션 할 수 있습니다.

NAME객체 이름내부 유형 이며이 함수는 해당 유형에 인수를 캐스팅하여 반환합니다.


고마워, 난 몰랐어 이 특정 기능 "이름"이 어디에나 문서화되어 있다면 무엇을 귀찮게합니까?
hegemon

내 답변 업데이트
Gaius

2
보다 정확하게는 row유형이 text함수의 입력 유형이므로 캐스트되고 있습니다 name. name함수는 다음 형태로 입력 된 문자열 (주조시)으로 변환된다 name(도 64 바이트로 절단하는 부작용이 있음)
잭 topanswers.xyz 시도 말한다

3

또한 PostgreSQL 8.3에서 이름으로 암시 적 캐스트가 제거되었으므로이 동작은 더 이상 작동하지 않습니다. 튜플은 자동으로 텍스트로 변환되지 않기 때문에 PostgreSQL 8.3 이상에서 실수로이 동작을 얻는 것은 사실상 불가능합니다.

9.1에서 :

or_examples=# select c.name from comp_table_test c;
ERROR:  column c.name does not exist
LINE 1: select c.name from comp_table_test c;

그러나 그 행동을 얻으려면 다음을 수행해야합니다.

or_examples=# select name(c::text) from comp_table_test c;

또는 comp_table_test 유형을 사용하여 원하는 것을 반환하는 자체 이름 함수를 정의 할 수 있습니다.


이 답변을 이해하지 못합니다. 위의 질문이 8.3 이상에서 더 이상 문제가되지 않아야한다고 말하고 있습니까? 그러나 질문은 9.0에 대해 묻습니다
Colin 't Hart

0

"name"은 예약 된 키워드 입니다. 따라서 키워드를 "따옴표로 묶어"사용해야합니다.

SELECT "name" FROM site;

이것은 과거에 나를 위해 이러한 문제 중 일부를 해결했지만 게시 한 코드도 인용하지 않고 작동해야합니다. 반면에

select site.name from site;

스키마를 명시 적으로 사용하여 열 이름을 확인하기 때문에 단어


1
많은 예약어를 사용할 수 있으며이 경우 인용해도 도움이되지 않습니다. site.name이 열로 존재하지 않는 경우 (8.3 이전) 사이트 데이터 유형 또는 사이트에서 내재적으로 캐스트 된 유형을 사용하는 이름 함수를 찾기 시작하기 때문에 발생 합니다. 사이트는 암시 적으로 텍스트로 캐스트 될 수 있으므로 name (text)이 사용됩니다. 결과적으로 마법이 유래 한 곳 select site.name from site으로 암시 적으로 변형 될 수 있습니다 select name(site::text) from site.
Chris Travers
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.