2012-10-18 50 views
79

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 ký tự thoát và sau đó thoát khỏi dấu và, nhưng đối với một số lý do này không hoạt động và tôi không chắc chắn về vấn đề chính xác của tôi là gì.Ký tự dấu và ký tự trong chuỗi 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); 

Mặc dù điều này có một giải pháp tương tự như this question, các vấn đề được đặt ra rất khác nhau. Họ có thể sẽ 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.

+0

tôi không nghĩ rằng bạn cần báo giá xung quanh ký tự thoát ('\') – mcalex

+17

'đặt định nghĩa tắt' là cách đơn giản nhất để thực hiện. – Annjawn

+1

Bản sao của http://stackoverflow.com/questions/118190/how-do-i-ignore-ampersands-in-a-sql-script-running-from-sql-plus – LordScree

Trả lời

124

Thay vì

node_name = 'Geometric Vectors \& Matrices' 

sử dụng

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

38 là mã ascii cho dấu và, và ở 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ể được sử dụng LIKE và một gạch dưới thay vào đó là '&' nhân vật:

node_name LIKE 'Geometric Vectors _ Matrices' 

Các cơ hội mà bạn sẽ tìm thấy một số kỷ lục khác nữa, đó là khác nhau chỉ trong một nhân vật này, là khá thấp.

+28

Thay vì không trực quan 'chr (38)', bạn có thể làm 'node_name = 'Hình học Vectors &' || 'Matrices'' –

27

Bạn có thể sử dụng

set define off 

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

81

Escape is set to \ by default, vì vậy bạn không cần phải cài đặt nó; nhưng nếu bạn làm, đừng quấn nó trong dấu ngoặc kép.

Công cụ quét là dấu cộng dòng SQL * Plus substitution variable; nhưng bạn có thể change it, hoặc một cách hữu ích hơn trong trường hợp của bạn tắt nó đi hoàn toàn, với:

set define off 

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

+0

Hoàn toàn đồng ý! – Annjawn

+1

Ký tự escape * được đặt thành '\' theo 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 phải thiết lập các ký tự thoát, nhưng anh/cô ấy cần phải ít nhất 'SET ESCAPE ON' cho rằng để 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

19

thẳng từ oracle sql nguyên tắc cơ bản cuốn sách

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

thế nào ai có thể thoát khỏi nó mà không cần thiết xác định.

+2

Việc bổ sung SET DEFINE ON là hữu ích. – KSev

0
REPLACE(<your xml column>,'&',chr(38)||'amp;') 
0

này hoạt động cũng như:

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

bạn xác định & như nghĩa đen bởi bao quanh là với qoutes đôi "&" trong chuỗi.

+0

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ư sau: 'A3D' & 'R01' –

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

hoặc cách khác:

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

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

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

Các vấn đề liên quan