12

次の問題があります。

名前付きの列 Name を持つテーブル T があります。名前の構造は次のとおりです。

A\\B\C

次のように自分で作成できます。

create table T ( Name varchar(10));

insert into T values ('A\\\\B\\C');

select * from T;

今私がこれを行うと:

select Name from T where Name = 'A\\B\C';

\ (バックスラッシュ) をエスケープする必要があります。

select Name from T where Name = 'A\\\\B\\C';

罰金。

しかし、これを文字列 Name に対して自動的に行うにはどうすればよいでしょうか?

次のようなものはそれを行いません:

select replace('A\\B\C', '\\', '\\\\');

私は得る:A\\\BC

助言がありますか?

よろしくお願いします。

4

6 に答える 6

5

そのままの文字列」を使用する必要があります。その文字列を使用した後、置換関数は次のようになります

Replace(@"\", @"\\")

お役に立てば幸いです。

于 2013-04-01T11:25:04.650 に答える
1

正規表現を使用すると、問題が解決します。

この以下のクエリは、与えられた例を解決します。

  1) S\\D\B

select * from T where Name REGEXP '[A-Z]\\\\\\\\[A-Z]\\\\[A-Z]$';

与えられた例に複数の文字が含まれている可能性がある場合

2) D\\B\ACCC

select * from T where Name REGEXP '[A-Z]{1,5}\\\\\\\\[A-Z]{1,5}\\\\[A-Z]{1,5}$';

注:テーブルの作成クエリで言及されているように、フィールドサイズが10であることを考慮して、charの最大出現回数として5を使用しました。

それでも一般化することはできますが、それでも期待に応えられない場合は、遠慮なく助けを求めてください。

于 2012-09-02T09:59:55.090 に答える
1

リテラルA\\B\Cは としてコーディングする必要がA\\\\A\\Cあり、 のパラメーターもreplace()エスケープする必要があります。

select 'A\\\\B\\C', replace('A\\\\B\\C', '\\', '\\\\');

出力(SQLFiddle で実行されているこれを参照):

A\\B\C         A\\\\B\\C


したがって、replace を使用する意味はほとんどありません。次の 2 つのステートメントは同等です。

select Name from T where Name = replace('A\\\\B\\C', '\\', '\\\\');
select Name from T where Name =         'A\\\\B\\C';
于 2012-04-08T03:55:29.700 に答える
1

データベースの内容と、そのデータを SQL ステートメントで表現する方法を混同しています。データベースの文字列に のような特殊文字が含まれている場合、は SQL 構文の特殊文字であるため、その文字を表す\ために入力する必要があります。これはステートメントで行う必要がありますが、関数のパラメーターでも行う必要があります。データに二重スラッシュは実際にはありません。二重スラッシュは UI の一部にすぎません。\\\INSERTREPLACE

SQL 式でスラッシュを 2 つにする必要があるのはなぜだと思いますか? クエリを入力している場合は、コマンド ラインでスラッシュを 2 つだけ使用する必要があります。プログラミング言語でクエリを生成している場合、最善の解決策は準備済みステートメントを使用することです。API が適切なエンコーディングを処理します (準備されたステートメントは通常、生データを処理するバイナリ インターフェイスを使用します)。何らかの理由で、文字列を作成してクエリを実行する必要がある場合、言語は文字列をエスケープする関数を提供する必要があります。たとえば、PHP ではmysqli_real_escape_string.

ただし、SQL 自体では実行できません。エスケープされていない文字列を SQL に入力しようとすると、データが失われ、再構築できません。

于 2012-09-03T15:13:52.563 に答える
0

使用できますLIKE

SELECT NAME FROM T WHERE NAME LIKE '%\\\\%';
于 2012-08-18T11:42:49.037 に答える
-3

あなたが何を意味するのか正確にはわかりませんが、これはうまくいくはずです。

select replace('A\\B\C', '\', '\\');

基本的に、\ が \\ に遭遇するたびに \ を置き換えます :)

これはあなたが望んでいたものですか?

于 2012-04-08T04:02:24.660 に答える