首页 > 解决方案 > 如何在 SQL Server where 子句中忽略 ' 字符?

问题描述

我在SQL Server上进行查询时遇到以下问题

我有这个简单的查询:

SELECT *
FROM [PROT_UTENTI]
WHERE 
    Nome = 'Paolo D''Aannuntis'

通过Nome字段查找用户(代表姓名和姓氏,我知道,这很可怕,但我无法更改数据库,因为它是生产中的旧遗留应用程序)。

如您所见,姓氏(D'Annuntis)包含'字符(我通过加倍 '' 来逃避它)。

问题是我正在使用从另一个数据库中提取它的Nome值执行此查询(它涉及迁移过程),其中保存了相同的Nome字段而没有'字符进入姓氏。

所以我正在执行这个查询:

SELECT *
FROM [PROT_UTENTI]
WHERE 
    Nome = 'Paolo DAannuntis'

反而

SELECT *
FROM [PROT_UTENTI]
WHERE 
    Nome = 'Paolo D''Aannuntis'

找到 0 个结果。

我的问题是:有一种方法可以忽略'所以 where 子句Nome = 'Paolo DAannuntis'可以找到相同的结果Nome = 'Paolo D''Aannuntis'

标签: sqlsql-serverwhere-clause

解决方案


您可以在搜索查询中用任何内容替换任何 '

SELECT *
FROM   [PROT_UTENTI]
WHERE  replace(Nome, '''', '') = 'Paolo DAannuntis'

您也可以在两侧进行替换

WHERE  replace(Nome, '''', '') = replace('Paolo D''Aannuntis', '''', '')

您写道,该值是在迁移中从另一个数据库中提取的,
所以我猜您将有一个变量。

declare @nome varchar(100) = 'Paolo D''Aannuntis' -- filled by your process

SELECT *
FROM   [PROT_UTENTI]
WHERE  replace(Nome, '''', '') = replace(@nome, '''', '')

无论变量中是否有引号,这都会找到您的行[PROT_UTENTU].nome

这会影响查询的性能,所以我希望你的表中没有数百万行


推荐阅读