在字符条件后加空格时,我可以选择一行

时间:2018-08-03 09:56:40

标签: sql-server

我有问题。当我使用2之1的查询时:

select * from GMIS.dbo.TELLER_HIS WHERE ID = 'TT1821103235;1    'AND DR_CR_MARKER = 'DEBIT  '
select * from GMIS.dbo.TELLER_HIS WHERE ID = 'TT1821103235;1' AND DR_CR_MARKER = 'DEBIT'

条件后我可以添加1个或多个空间,它只有1个结果。 ID,DR_CR_MARKER结果中没有任何空格。 请帮忙!  : enter image description here

2 个答案:

答案 0 :(得分:1)

认为,您实际上是在问为什么'abcdefg' = 'abcdefg '的计算结果为TRUE? (您的“问题” 非常不清楚。)

这是SQL Server处理(n)varchar(n)char数据类型的方式。使用(n)varchar时,值为“未填充”。因此,值'abcdefg '将被视为'abcdefg'。因此,'abcdefg' = 'abcdefg '为何为TRUE。

对于(n)char,将数据填充为数据类型的长度。例如,以char(12)为例:值'abcdefg''abcdefg '都将被视为'abcdefg ',因此也取值为TRUE。

示例:

SELECT CASE WHEN CONVERT(varchar(20),'abcdefg') = CONVERT(varchar(20),'abcdefg    ') THEN 1 ELSE 0 END;
SELECT CASE WHEN CONVERT(char(20),'abcdefg') = CONVERT(char(20),'abcdefg    ') THEN 1 ELSE 0 END;

这两个语句都返回1;

答案 1 :(得分:0)

您可以在SQL Server中使用LTRIM & RTRIM函数

SELECT * 
FROM GMIS.dbo.TELLER_HIS 
WHERE LTRIM(RTRIM(ID)) = 'TT1821103235;1' 
AND LTRIM(RTRIM(DR_CR_MARKER)) = 'DEBIT'

如果要区分这些查询,请使用类似运算符

没有空格

SELECT * 
FROM GMIS.dbo.TELLER_HIS 
WHERE LTRIM(RTRIM(ID)) = 'TT1821103235;1' 
AND LTRIM(RTRIM(DR_CR_MARKER)) like 'DEBIT'

有空格

SELECT * 
FROM GMIS.dbo.TELLER_HIS 
WHERE LTRIM(RTRIM(ID)) = 'TT1821103235;1   ' 
AND LTRIM(RTRIM(DR_CR_MARKER)) like 'DEBIT    '

带空格的“喜欢”查询将不提供任何数据。