我遇到以下问题:
我有一个表T,它有一个名称列名。名称具有以下结构:
一个\\乙\ 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
有什么建议吗?
非常感谢提前。
答案 0 :(得分:3)
你必须使用“逐字字符串”。使用该字符串后你的替换函数会 看起来像这样
Replace(@"\", @"\\")
我希望它会对你有所帮助。
答案 1 :(得分:1)
文字A\\B\C
必须编码为A\\\\A\\C
,replace()
的参数也需要转义:
select 'A\\\\B\\C', replace('A\\\\B\\C', '\\', '\\\\');
输出(见this running on SQLFiddle):
A\\B\C A\\\\B\\C
所以使用替换没什么意义。这两个陈述是等价的:
select Name from T where Name = replace('A\\\\B\\C', '\\', '\\\\');
select Name from T where Name = 'A\\\\B\\C';
答案 2 :(得分:1)
正则表达式的使用将解决您的问题。
以下查询将解决给定的示例。
1) S\\D\B
select * from T where Name REGEXP '[A-Z]\\\\\\\\[A-Z]\\\\[A-Z]$';
如果给定示例可能包含多个char
2) D\\B\ACCC
select * from T where Name REGEXP '[A-Z]{1,5}\\\\\\\\[A-Z]{1,5}\\\\[A-Z]{1,5}$';
注意:我使用5作为char的最大出现次数,考虑到字段大小为10,如创建表查询中所述。
我们仍然可以概括它。如果这仍未达到您的期望,请随时寻求我的帮助。
答案 3 :(得分:1)
您将数据库中的内容与您在SQL语句中表示数据的方式混淆。当数据库中的字符串包含特殊字符\
时,您必须键入\\
来表示该字符,因为\
是SQL语法中的特殊字符。您必须在INSERT
语句中执行此操作,但您还必须在REPLACE
函数的参数中执行此操作。数据中实际上从来没有任何双斜线,它们只是UI的一部分。
为什么您认为需要在SQL表达式中加倍斜杠?如果您正在键入查询,则应该在命令行中加倍斜杠。如果您使用编程语言生成查询,最好的解决方案是使用预准备语句; API将处理正确的编码(预处理语句通常使用二进制接口,处理原始数据)。如果由于某种原因,您需要通过构造字符串来执行查询,那么语言应该提供一个函数来转义字符串。例如,在PHP中,您将使用mysqli_real_escape_string
。
但是您无法通过SQL本身来实现 - 如果您尝试将非转义字符串提供给SQL,则数据会丢失并且无法重建它。
答案 4 :(得分:0)
您可以使用LIKE
:
SELECT NAME FROM T WHERE NAME LIKE '%\\\\%';
答案 5 :(得分:-3)
不完全确定你的意思但是,这应该有效。
select replace('A\\B\C', '\', '\\');
它基本上会用\\:)
替换\这是你想要的吗?