Thoát ký tự dấu và trong chuỗi SQL


143

Tôi đang cố gắng truy vấn một hàng nhất định theo tên trong cơ sở dữ liệu sql của tôi và nó có dấu và. Tôi đã cố gắng thiết lập một nhân vật thoát và sau đó thoát khỏi ký hiệu, nhưng vì một số lý do, điều này không hoạt động và tôi không chắc chính xác vấn đề của mình là gì.

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);

Mặc dù điều này có một giải pháp tương tự cho câu hỏi này , nhưng các vấn đề được đặt ra rất khác nhau. Họ có thể có cùng một giải pháp, nhưng điều đó không có nghĩa là các câu hỏi đều giống nhau.


Tôi không nghĩ rằng bạn cần trích dẫn xung quanh nhân vật thoát ('\')
mcalex

29
set define offlà cách đơn giản nhất để làm điều đó.
AnBisw

Câu trả lời:


205

Thay vì

node_name = 'Geometric Vectors \& Matrices'

sử dụng

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

38 là mã ascii cho ký hiệu và trong dạng này, nó sẽ được hiểu là một chuỗi, không có gì khác. Tôi đã thử và nó đã hoạt động.

Một cách khác có thể là sử dụng THÍCH và gạch chân thay vì ký tự '&':

node_name LIKE 'Geometric Vectors _ Matrices' 

Cơ hội bạn sẽ tìm thấy một số bản ghi khác, chỉ khác ở một nhân vật này, là khá thấp.


45
Thay vì không trực quan chr(38), bạn có thể làmnode_name = 'Geometric Vectors &' || ' Matrices'
Jay Sullivan

1
Đối với những linh hồn nghèo khó lẫn lộn khác giống như tôi, lưu ý rằng nó là chr(38), không char(38) .
xdhmoore

Lưu ý rằng &không cần phải thoát trong MySQL. Ngoài ra MySQL không có chức năng CHR().
asmaier

113

Escape được đặt thành \mặc định , vì vậy bạn không cần thiết lập nó; nhưng nếu bạn làm thế, đừng bao bọc nó trong dấu ngoặc kép.

Ampersand là điểm đánh dấu biến thay thế SQL * Plus ; nhưng bạn có thể thay đổi nó , hoặc hữu ích hơn trong trường hợp của bạn tắt nó hoàn toàn, với:

set define off

Sau đó, bạn không cần phải bận tâm đến việc thoát khỏi giá trị.


2
tự thoát được đặt thành \ mặc định, nhưng tham số boolean escapeđược đặt thành TẮT theo mặc định. Vì vậy, OP có thể không cần thiết lập ký tự thoát, nhưng ít nhất anh ấy / cô ấy cần SET ESCAPE ONphải làm việc đó. Hoặc, tất nhiên, sử dụng bất kỳ giải pháp nào khác, tốt hơn.
mathguy

46

Bạn có thể dùng

set define off

Sử dụng nó sẽ không nhắc cho đầu vào


32

trực tiếp từ cuốn sách cơ bản của oracle sql

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

Làm thế nào một người sẽ thoát khỏi nó mà không thiết lập định nghĩa.


2
Việc bổ sung SET DEFINE ON rất hữu ích.
KSev

@Roman Nếu không xác định, bạn cũng có thể sử dụng: chọn 'Coda' '&' 'Sid' từ kép; (trích dẫn đơn kép)
antcalvente

8

Để thoát, &bạn có thể thử các cách sau: -

  1. set scan off
  2. set define off
  3. set escape on sau đó thay thế &bằng/&
  4. thay thế &bằng&&

Một trong số họ nên làm việc ít nhất.

Thông thường, nếu bạn đang sử dụng nhà phát triển PL / SQL thì có biểu tượng & ở dưới cùng của cửa sổ sql, vui lòng đến đó và tắt . Lưu ý trong phiên bản cũ hơn tùy chọn này không có.

Ngoài ra, hãy đảm bảo thiết lập xác định tắt được viết ngay từ đầu tập lệnh.


2

Điều này cũng hoạt động:

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

bạn định &nghĩa bằng chữ bằng cách bao quanh là với hai qoutes "&"trong chuỗi.


1
Nếu bạn làm điều đó, dấu ngoặc kép sẽ trở thành một phần của chuỗi, như thế này:A3D"&"R01
David Balažic

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

Hay cách khác:

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

Việc đầu tiên cho phép bạn sử dụng dấu gạch chéo ngược để thoát khỏi &.

Thứ hai tắt & "toàn cầu" (không cần thêm dấu gạch chéo ở bất cứ đâu). Bạn có thể bật lại lần nữa set define onvà từ dòng đó trên ký hiệu sẽ lấy lại ý nghĩa đặc biệt của chúng, vì vậy bạn có thể tắt nó cho một số phần của tập lệnh chứ không phải cho các phần khác.



0

Tôi đã viết một regex để giúp tìm và thay thế "&" trong một INSERT, tôi hy vọng rằng điều này sẽ giúp được ai đó.

Bí quyết là đảm bảo rằng "&" là với văn bản khác.

Tìm thấy “(\'[^\']*(?=\&))(\&)([^\']*\')”

Thay thế “$1' || chr(38) || '$3”

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.