Próbuję wysłać zapytanie do określonego wiersza według nazwy w mojej bazie danych sql i ma ampersand. Próbowałem ustawić znak ucieczki, a następnie uciec przed ampersandem, ale z jakiegoś powodu to nie działa i nie jestem pewien, na czym dokładnie polega mój problem.
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);
Chociaż daje to podobne rozwiązanie tego pytania , problemy są postawione bardzo różnie. Mogą skończyć z tym samym rozwiązaniem, ale to nie znaczy, że pytania są takie same.
set define off
to najprostszy sposób na zrobienie tego.Odpowiedzi:
Zamiast
posługiwać się
38 to kod ascii dla znaku ampersand iw tej formie zostanie zinterpretowany jako ciąg, nic więcej. Spróbowałem i zadziałało.
Innym sposobem może być użycie LIKE i podkreślenia zamiast znaku „&”:
Szansa, że znajdziesz też inny rekord, który różni się tylko tą jedną postacią, jest dość niska.
źródło
chr(38)
, możesz to zrobićnode_name = 'Geometric Vectors &' || ' Matrices'
chr(38)
, niechar(38)
.&
w MySQL nie ma potrzeby zmiany znaku ucieczki. MySQL również nie ma tej funkcjiCHR()
.Escape jest ustawiony
\
domyślnie , więc nie musisz go ustawiać; ale jeśli tak, nie zawijaj tego w cudzysłów.Ampersand jest znacznikiem zmiennej substytucyjnej SQL * Plus ; ale możesz to zmienić lub, co bardziej przydatne w twoim przypadku, całkowicie go wyłączyć, za pomocą:
Wtedy nie musisz w ogóle zawracać sobie głowy ucieczką od wartości.
źródło
\
domyślnie ustawiony na , ale parametr boolowskiescape
jest domyślnie ustawiony na WYŁ. Więc OP może nie potrzebować ustawiać znaku ucieczki, ale musi to przynajmniejSET ESCAPE ON
zrobić, aby to zadziałało. Lub oczywiście skorzystaj z innych, lepszych rozwiązań.Możesz użyć
Użycie tego nie zapyta o dane wejściowe
źródło
prosto z książki o podstawach Oracle sql
jak można od tego uciec bez ustalania definicji.
źródło
Aby uciec
&
, możesz spróbować następujących sposobów: -set scan off
set define off
set escape on
następnie zamień&
na/&
&
na&&
Jeden z nich powinien przynajmniej działać.
Dodatkowo, jeśli używasz programisty PL / SQL, na dole okna sql znajduje się ikona &, przejdź tam i wyłącz ją . Uwaga w starszej wersji tej opcji nie ma.
Upewnij się również, że set define off jest napisane na samym początku skryptu.
źródło
Działa to również:
select * from mde_product where cfn = 'A3D"&"R01'
definiujesz
&
jako literał przez umieszczenie"&"
w ciągu znaków podwójnych qoutes .źródło
A3D"&"R01
lub alternatywnie:
Pierwsza pozwala na użycie ukośnika odwrotnego do zmiany znaku &.
Drugi wyłącza się & „globalnie” (nie trzeba nigdzie dodawać ukośnika). Możesz go ponownie włączyć, gdy
set define on
i od tego wiersza znaki ampersand odzyskają swoje specjalne znaczenie, więc możesz je wyłączyć dla niektórych części skryptu, a nie dla innych.źródło
źródło
Napisałem wyrażenie regularne, aby pomóc znaleźć i zamienić „&” w INSERT, mam nadzieję, że to komuś pomoże.
Sztuczka polegała na upewnieniu się, że „&” występuje z innym tekstem.
Odnaleźć
“(\'[^\']*(?=\&))(\&)([^\']*\')”
Zastąpić
“$1' || chr(38) || '$3”
źródło