12

我遇到以下问题:

我有一个表 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';

美好的。

但是如何自动对字符串名称执行此操作?

像下面这样的东西不会这样做:

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

我得到:A\\\BC

有什么建议么?

提前谢谢了。

4

6 回答 6

5

您必须使用“逐字字符串”。使用该字符串后,您的替换函数将如下所示

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

我希望它对你有帮助。

于 2013-04-01T11:25:04.650 回答
1

您将数据库中的内容与您在 SQL 语句中表示该数据的方式混淆了。当数据库中的字符串包含特殊字符\时,您必须键入\\来表示该字符,因为\它是 SQL 语法中的特殊字符。您必须在INSERT语句中执行此操作,但您还必须在REPLACE函数的参数中执行此操作。数据中实际上从来没有任何双斜杠,它们只是 UI 的一部分。

为什么你认为你需要在 SQL 表达式中加倍斜杠?如果您正在输入查询,则应该在命令行中将斜杠加倍。如果您使用编程语言生成查询,最好的解决方案是使用准备好的语句;API 将负责正确的编码(准备好的语句通常使用处理原始数据的二进制接口)。如果出于某种原因,您需要通过构造字符串来执行查询,那么语言应该希望提供一个函数来转义字符串。例如,在 PHP 中,您将使用mysqli_real_escape_string.

但是您不能通过 SQL 本身来做到这一点——如果您尝试将未转义的字符串提供给 SQL,则数据会丢失并且无法重建。

于 2012-09-03T15:13:52.563 回答
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,如创建表查询中所述,我使用 5 作为 char 的最大出现次数。

我们仍然可以概括它。如果这仍然没有达到您的期望,请随时寻求我的帮助。

于 2012-09-02T09:59:55.090 回答
1

文字A\\B\C必须编码为A\\\\A\\Creplace()需要转义的参数:

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

输出(参见在 SQLFiddle 上运行):

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


所以使用replace没有什么意义。这两个语句是等价的:

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 回答
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 回答