在 SQL Server 2008 中,为什么这会返回行,即使我在 where 子句末尾添加一个或两个或更多空格?在下面的例子中不应该找到零记录吗?
WITH SRC AS (SELECT cast('12345' as varchar) DEMO)
SELECT * FROM SRC WHERE DEMO='12345 '
Run Code Online (Sandbox Code Playgroud)
如果需要查询来查找'1234 '但不需要查询怎么办'1234'
Eri*_*c S 10
发生的事情是 SQL 将空格填充到字符串的末尾,以便它们具有相同的长度。因此,如果您尝试执行以下操作:
SELECT 1 WHERE '' = ' '
Run Code Online (Sandbox Code Playgroud)
即使它们不一样,您实际上也会得到 1。但是,如果您执行以下操作:
SELECT 1 WHERE 'a' = ' a'
Run Code Online (Sandbox Code Playgroud)
它不会返回任何内容,因为它将比较不匹配的“a”和“a”。
但是,这将返回 1:
SELECT 1 WHERE 'a' = 'a '
Run Code Online (Sandbox Code Playgroud)
因为它正在比较 'a ' 和 'a '
如果需要查询以找到“1234”而不是“1234”怎么办
如果您使用 Unicode 数据,则可以简单地使用LIKE. 从文档:
当所有参数(match_expression、pattern 和 escape_character,如果存在)都是 ASCII 字符数据类型时,将执行 ASCII 模式匹配。如果任一参数是 Unicode 数据类型,则所有参数都将转换为 Unicode 并执行 Unicode 模式匹配。当您将 Unicode 数据(nchar或nvarchar数据类型)与 LIKE 一起使用时,尾随空白很重要;但是,对于非 Unicode 数据,尾随空白并不重要。Unicode LIKE 与 ISO 标准兼容。ASCII LIKE 与早期版本的 SQL Server 兼容。
对于非 Unicode 数据,您仍然可以获得 UnicodeLIKE行为,但需要进行一些隐式转换(注意LIKE第二个查询中的模式有一个前导“N”,表示 Unicode 字符串文字):
DECLARE @T AS table
(
pk integer IDENTITY PRIMARY KEY,
v varchar(10) NOT NULL,
UNIQUE (v, pk)
);
INSERT @T (v)
VALUES
('1234'),
('1234' + SPACE(1)),
('1234' + SPACE(2)),
('1234' + SPACE(3));
SELECT REPLACE(T.v, SPACE(1), '@')
FROM @T AS T
WHERE T.v LIKE '1234 ';
SELECT REPLACE(T.v, SPACE(1), '@')
FROM @T AS T
WHERE T.v LIKE N'1234 ';
Run Code Online (Sandbox Code Playgroud)
结果:
通过动态查找生成的魔力,带有隐式转换的代码可能仍然能够使用索引:
关于问题的以下部分:
如果需要查询以找到“1234”而不是“1234”怎么办
似乎使用二进制排序规则(即以 结尾的排序规则_BIN2)对此不起作用,但您还可以比较DATALENGTH两个值:
SET NOCOUNT ON;
DECLARE @T TABLE (Col1 VARCHAR(10));
INSERT INTO @T (Col1) VALUES ('12345 ');
INSERT INTO @T (Col1) VALUES ('12345');
SELECT DATALENGTH(Col1) AS [Col1Bytes], '~' + Col1 + '~' AS [Col1] FROM @T;
SELECT DATALENGTH(Col1) AS [Col1Bytes], '~' + Col1 + '~' AS [Col1] FROM @T
WHERE Col1 = '12345 '
AND DATALENGTH(Col1) = DATALENGTH('12345 ');
Run Code Online (Sandbox Code Playgroud)
返回:
Col1Bytes Col1
7 ~12345 ~
5 ~12345~
Col1Bytes Col1
7 ~12345 ~
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
303 次 |
| 最近记录: |