SQL 문자열에서 앰퍼샌드 문자 이스케이프


143

내 SQL 데이터베이스에서 이름으로 특정 행을 쿼리하려고하는데 앰퍼샌드가 있습니다. 이스케이프 문자를 설정하고 앰퍼샌드를 이스케이프하려고했지만 어떤 이유로 든 작동하지 않으며 정확히 내 문제가 무엇인지 확실하지 않습니다.

Set escape '\'
    select * from V1144engine.T_nodes where node_id in(
    select node2_id from V1144engine.T_edges where node1_id in(
    select node2_id from V1144engine.T_edges where node1_id in(
    select node2_id from V1144engine.T_edges where node1_id = 
      (select node_id from V1144engine.T_nodes where node_name = 'Geometric Vectors \& Matrices')))
    and edge_type_id = 1)
    and node_type_id = 1
    and node_id in (
    select node2_id from V1144engine.T_edges where node1_id =
      (select node_id from V1144engine.T_nodes where node_name = 'Algebra II')
    and edge_type_id = 2);

이것은 이 질문 과 비슷한 해결책을 가지고 있지만 문제는 매우 다르게 제기됩니다. 그들은 같은 해결책을 가질 수도 있지만 질문이 동일하다는 것을 의미하지는 않습니다.


난 당신이 탈출 ( '\') 문자 주위에 따옴표가 필요하다고 생각하지 않습니다
mcalex

29
set define off가장 간단한 방법입니다.
AnBisw

답변:


205

대신에

node_name = 'Geometric Vectors \& Matrices'

사용하다

node_name = 'Geometric Vectors ' || chr(38) || ' Matrices' 

38은 앰퍼샌드의 ASCII 코드이며이 형식에서는 문자열로 해석됩니다. 나는 그것을 시도했고 효과가 있었다.

또 다른 방법은 LIKE와 밑줄 대신 '&'문자를 사용하는 것입니다.

node_name LIKE 'Geometric Vectors _ Matrices' 

이 문자 하나만 다른 다른 레코드도 찾을 가능성은 매우 낮습니다.


45
직관적이지 않은 대신 chr(38), 할 수 있습니다node_name = 'Geometric Vectors &' || ' Matrices'
Jay Sullivan

1
다른 가혹한 혼동 된 영혼들도 나 자신 chr(38)같지 않다 char(38) .
xdhmoore

참고 &이 필요하지 않습니다 MySQL의에서 탈출합니다. 또한 MySQL에는 기능이 없습니다 CHR().
asmaier

113

이스케이프는 \기본적으로 설정되어 있으므로 설정할 필요가 없습니다. 하지만 그렇게한다면 따옴표로 묶지 마십시오.

앰퍼샌드는 SQL * Plus 치환 변수 마커입니다. 그러나 다음과 같이 변경 하거나 더 유용하게 사용할 수 있습니다 .

set define off

그런 다음 값을 이스케이프 처리 할 필요가 없습니다.


2
이스케이프 문자\ 기본적으로 설정되어 있지만 부울 매개 변수 escape는 기본적으로 OFF로 설정되어 있습니다. 따라서 OP는 이스케이프 문자를 설정할 필요는 없지만 적어도 SET ESCAPE ON작동 하려면 이스케이프 문자가 필요합니다 . 또는 다른 더 나은 솔루션을 사용하십시오.
mathguy

46

당신이 사용할 수있는

set define off

이것을 사용하면 입력하라는 메시지가 표시되지 않습니다


32

오라클 SQL 기초 책에서 바로

SET DEFINE OFF
select 'Coda & Sid' from dual;
SET DEFINE ON

define을 설정하지 않고 어떻게 벗어날 수 있을까요?


2
SET DEFINE ON을 추가하면 도움이됩니다.
KSev

@Roman 정의 없이도 사용할 수 있습니다 : dual에서 'Coda' '&' 'Sid'를 선택하십시오. (double single quotes)
antcalvente

8

탈출하기 위해 &다음과 같은 방법을 시도 할 수 있습니다 :-

  1. set scan off
  2. set define off
  3. set escape on 다음 대체 &에 의해/&
  4. 교체 &&&

그들 중 하나는 적어도 작동해야합니다.

사용하는 dditionally 경우 PL / SQL 개발자는이 및 아이콘 SQL 창 하단에서이 가서하시기 바랍니다 비활성화 . 이전 버전에서는이 옵션이 없습니다.

또한 set define off가 스크립트의 맨 처음에 작성되었는지 확인하십시오.


2

이것은 또한 작동합니다 :

select * from mde_product where cfn = 'A3D"&"R01'

문자열에 &이중 qoutes "&"를 포함하여 리터럴로 정의 합니다.


1
그렇게하면 큰 따옴표가 다음과 같이 문자열의 일부가됩니다.A3D"&"R01
David Balažic

2
set escape on
... node_name = 'Geometric Vectors \& Matrices' ...

또는 대안 적으로 :

set define off
... node_name = 'Geometric Vectors & Matrices' ...

첫 번째는 백 슬래시를 사용하여 &를 피할 수 있습니다.

두 번째는 "전역 적으로"꺼지고 "어딘가에 백 슬래시를 추가 할 필요가 없습니다". set define on앰퍼샌드의 해당 줄에서 다시 켜면 특별한 의미가 다시 표시되므로 스크립트의 일부 부분에서는 사용하지 않을 수 있습니다.



0

INSERT 내에서 "&"를 찾아 바꾸는 데 도움이되는 정규식을 작성했습니다. 이것이 누군가에게 도움이되기를 바랍니다.

트릭은 "&"가 다른 텍스트와 함께 있는지 확인하는 것이 었습니다.

찾기 “(\'[^\']*(?=\&))(\&)([^\']*\')”

바꾸다 “$1' || chr(38) || '$3”

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.