我有一个奇怪的要求,我thikn。 我有一个系统,我需要从中检索数据 - 基于SQL。相关字段中包含大量数据,但我特别需要1或2个值。
在下面的示例中,该字段包含“*”中包含的值。我需要检索AQISPremIdProcessType_Hidden的值,即“N2725 / D”。这可以通过SQL脚本吗?
AQISEntityIds_Hidden=CN0001MB*AQISPremIdProcessType_Hidden=N2725/D*CPQuestionGenDate_Hidden=20/01/2017
答案 0 :(得分:0)
我认为您的数据库设计可能存在问题。当然,我可能错了,但有没有办法设计一个包含以下列的表?
AQISEntityIds_Hidden | AQISPremIdProcessType_Hidden | CPQuestionGenDate_Hidden
如何将值插入数据库?你使用PHP吗?
您的字符串是两次分隔的类型' *'和' ='作为分隔符。因此,如果您使用PHP,则可以展开字符串以获取所需的值,并将它们存储在表中的单独字段中。这样,您可以更轻松地处理这些值(这是数据库的目的)。
如果您的项目中无法实现上述目标,我很抱歉。我写这个答案,以防你在整个代码方法和数据库设计中修复一些东西,以使事情更容易。
答案 1 :(得分:0)
您可以使用charindex(<what>, <where>)
功能。首先,找到AQISPremIdProcessType_Hidden=
字符串的索引。第二,找到它之后的第一个*
的索引。
这是一个例子:
declare
@testString nvarchar(max) = N'AQISEntityIds_Hidden=CN0001MB*AQISPremIdProcessType_Hidden=N2725/D*CPQuestionGenDate_Hidden=20/01/2017',
@field nvarchar(max) = N'AQISPremIdProcessType_Hidden=';
;with _rawInfo as(
select @testString as [Str]
)
, _trimmedStart as (
select
[Str] as [Origin],
-- check here the math: 2nd arg = length of the tail, so we take
-- whole length [StrLen] and subtract index of @field and its length
right([Str], [StrLen] - FieldInd - FieldLen + 1) as Tail
from _rawInfo
cross apply (
select
len([Str]) as [StrLen],
charindex(@field, [Str]) as FieldInd,
len(@field) as FieldLen
) x
), _result as (
select
[Origin],
Tail,
-- 2nd arg = length of the left cut, so we just take index of '*'
left(Tail, charindex(N'*', Tail) - 1) as [Value]
from _trimmedStart
)
select
*
from _result
<强> UPD 即可。并根据您的数据进行查询:
;with _trimmedStart as (
select
jd.*,
right(AddInfo, AddInfoLen - FieldInd - FieldLen + 1) as AddInfoTail
from JobDeclaration jd
cross apply (
select
len(AddInfo) as AddInfoLen,
charindex(@field, AddInfo) as FieldInd,
len(@field) as FieldLen
) x
), _result as (
select
t.*,
left(AddInfoTail, charindex(N'*', AddInfoTail) - 1) as [AQISPremIdProcessType_Hidden]
from _trimmedStart t
)
select
*
from _result