SQL查找值之间*

时间:2017-06-08 23:26:47

标签: sql sql-server-2016

我有一个奇怪的要求,我thikn。 我有一个系统,我需要从中检索数据 - 基于SQL。相关字段中包含大量数据,但我特别需要1或2个值。

在下面的示例中,该字段包含“*”中包含的值。我需要检索AQISPremIdProcessType_Hidden的值,即“N2725 / D”。这可以通过SQL脚本吗?

AQISEntityIds_Hidden=CN0001MB*AQISPremIdProcessType_Hidden=N2725/D*CPQuestionGenDate_Hidden=20/01/2017

2 个答案:

答案 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