我在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%","%'
我想知道我是否正确查询,因为对于某些搜索字符串,它不会产生正确的结果。有人可以帮帮我吗?
编辑:我删除了粗体格式
答案 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))
最多但不包括子串中的第一个"
(这就是它被使用两次的原因)。