如何使用多%的通配符编写SQL查询

时间:2013-11-11 23:02:30

标签: sql sql-server

我在Sql Server表中有一个coloumn:

companystring = {"CompanyId":0,"CompanyType":1,"CompanyName":"Test     
215","TradingName":"Test     215","RegistrationNumber":"Test 
215","Email":"test215@tradeslot.com","Website":"Test    
215","DateStarted":"2012","CompanyValidationErrors":[],"CompanyCode":null}

我想查询列以搜索

companyname like '%CompanyName":"%test 2%","%'

我想知道我是否正确查询,因为对于某些搜索字符串,它不会产生正确的结果。有人可以帮帮我吗?

编辑:我删除了粗体格式

3 个答案:

答案 0 :(得分:2)

%是一个特殊字符,表示通配符。如果要在字符串中找到实际字符,则需要将其转义。

DECLARE @d TABLE(id INT, s VARCHAR(32));

INSERT @d VALUES(1,'foo%bar'),(2,'fooblat');

SELECT id, s FROM @d WHERE s LIKE 'foo[%]%'; -- returns only 1

SELECT id, s FROM @d WHERE s LIKE 'foo%'; -- returns both 1 and 2

答案 1 :(得分:0)

根据您的平台,您可以使用内置于其主库中的正则表达式和/或lambda表达式的某种组合。例如,.NET有LINQ,它是一个强大的工具,可以抽象查询并为搜索提供杠杆作用。

答案 2 :(得分:0)

看起来您将JSON数据存储在名为“companystring”的列中。如果你想在SQL中搜索JSON数据,那么事情变得非常棘手。

我建议您在插入/更新时查看一些额外的处理,以显示您要搜索的JSON的属性。

如果按照您描述的方式进行搜索,您实际上需要使用正则表达式或其他内容来使其可靠。

在您的示例中,您说要搜索:

companystring like '%CompanyName":"%test 2%","%'

我理解这是在JSON中搜索“CompanyName”属性中某处的字符串“test 2”。不幸的是,这也会返回在“CompanyName”之后的任何其他属性中找到“test 2”的结果,如下所示:

-- formatted for readability
companystring = '{
    "CompanyId":0,
    "CompanyType":1,
    "CompanyName":"Test Something 215",
    "TradingName":"Test 215",
    "RegistrationNumber":"Test 215",
    "Email":"test215@tradeslot.com",
    "Website":"Test 215",
    "DateStarted":"2012",
    "CompanyValidationErrors":[],
    "CompanyCode":null}'

即使“测试2”不在CompanyName中,它也在其后面的文本(TradingName)中,后面跟着字符串",",因此它符合您的搜索条件。

另一种选择是创建一个使用如下定义的列公开CompanyName值的视图:

LEFT(
    SUBSTRING(companystring, CHARINDEX('"CompanyName":"', companystring) + LEN('"CompanyName":"'), LEN(companystring)),
    CHARINDEX('"', SUBSTRING(companystring, CHARINDEX('"CompanyName":"', companystring) + LEN('"CompanyName":"'), LEN(companystring))) - 1
) AS CompanyName

然后,您可以使用WHERE CompanyName LIKE '%test 2%'查询该视图,但它可以正常运行,但性能可能会成为一个问题。

上述逻辑是在"CompanyName":":

之后获取所有内容
SUBSTRING(companystring, CHARINDEX('"CompanyName":"', companystring) + LEN('"CompanyName":"'), LEN(companystring))

最多但不包括子串中的第一个"(这就是它被使用两次的原因)。