Sql server 仅选中字符串中存在的特定字段

Sql server 仅选中字符串中存在的特定字段,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,如果以下条件字符串仅包含数字字段,我想打印它 DECLARE @Condition varchar(max) = 'Number =''12908,13232323,12122'' AND Name=''Mak''' DECLARE @Condition1 varchar(max) = 'Address=''UK'' AND Number =''12908'' AND Name=''Mak''' DECLARE @Condition2 varchar(max) = 'Number =''12

如果以下条件字符串仅包含数字字段,我想打印它

DECLARE @Condition varchar(max) = 'Number =''12908,13232323,12122'' AND Name=''Mak'''

DECLARE @Condition1 varchar(max) = 'Address=''UK'' AND Number =''12908'' AND Name=''Mak'''

DECLARE @Condition2 varchar(max) = 'Number =''12908,13232323'''
注意:条件字符串是动态的,可能带有任意数量的字段,但我只想在它包含数字时打印它

预期结果:应打印给定条件中的2

Number = '12908,13232323'

我使用cte分割函数

CREATE function [dbo].[fn_string_split](@str NVARCHAR(MAX)
, @delimiter NVARCHAR(255))
returns table
as
return
WITH a AS(
        SELECT CAST(0 AS BIGINT) as idx1,CHARINDEX(@delimiter,@str) idx2
        UNION ALL
        SELECT idx2+1,CHARINDEX(@delimiter,@str,idx2+1)
        FROM a
        WHERE idx2>0
    )
    SELECT SUBSTRING(@str,idx1,COALESCE(NULLIF(idx2,0),LEN(@str)+1)-idx1) as value, row_number() over (Order by idx1) RN
    FROM a
然后利用这些数据识别每个字符串中的条件数,然后进行筛选

DECLARE @Condition varchar(max) = 'Number =''12908,13232323,12122'' AND Name=''Mak'''

DECLARE @Condition1 varchar(max) = 'Address=''UK'' AND Number =''12908'' AND Name=''Mak'''

DECLARE @Condition2 varchar(max) = 'Number =''12908,13232323'''

DECLARE @Table AS TABLE (ID INT, Condition varchar(MAX))
INSERT INTO @Table VALUES
(0,@Condition),(1,@Condition1),(2,@Condition2);

WITH CTE AS (
SELECT T.*, C.value,COUNT(1) OVER (PARTITION BY ID) Cnt
FROM @Table T
CROSS APPLY dbo.fn_string_split(Condition,'AND') C 
)
SELECT * FROM cte WHERE Cnt=1 AND LEFT(REPLACE(value,' ',''),7) = 'Number='

可以做一些更多的调整,以排除外围情况,但希望这将使您开始。

我使用cte分割函数

CREATE function [dbo].[fn_string_split](@str NVARCHAR(MAX)
, @delimiter NVARCHAR(255))
returns table
as
return
WITH a AS(
        SELECT CAST(0 AS BIGINT) as idx1,CHARINDEX(@delimiter,@str) idx2
        UNION ALL
        SELECT idx2+1,CHARINDEX(@delimiter,@str,idx2+1)
        FROM a
        WHERE idx2>0
    )
    SELECT SUBSTRING(@str,idx1,COALESCE(NULLIF(idx2,0),LEN(@str)+1)-idx1) as value, row_number() over (Order by idx1) RN
    FROM a
然后利用这些数据识别每个字符串中的条件数,然后进行筛选

DECLARE @Condition varchar(max) = 'Number =''12908,13232323,12122'' AND Name=''Mak'''

DECLARE @Condition1 varchar(max) = 'Address=''UK'' AND Number =''12908'' AND Name=''Mak'''

DECLARE @Condition2 varchar(max) = 'Number =''12908,13232323'''

DECLARE @Table AS TABLE (ID INT, Condition varchar(MAX))
INSERT INTO @Table VALUES
(0,@Condition),(1,@Condition1),(2,@Condition2);

WITH CTE AS (
SELECT T.*, C.value,COUNT(1) OVER (PARTITION BY ID) Cnt
FROM @Table T
CROSS APPLY dbo.fn_string_split(Condition,'AND') C 
)
SELECT * FROM cte WHERE Cnt=1 AND LEFT(REPLACE(value,' ',''),7) = 'Number='

可以做更多的调整来排除外围案例,但希望这能让您开始。

尝试了以下方法并完成了工作

DECLARE @Condition varchar(max) = 'Number =''12908,13232323,12122'' AND Name=''Mak'''

DECLARE @Condition1 varchar(max) = 'Address=''UK'' OR Number =''12908'' AND Name=''Mak'''

DECLARE @Condition2 varchar(max) = 'Number =''12908,13232323'''

IF REPLACE(REPLACE(@Condition,' OR ',' @ '),' AND ',' @ ') NOT LIKE '%@%' 
BEGIN
    PRINT(@Condition);
END
ELSE IF REPLACE(REPLACE(@Condition1,' OR ',' @ '),' AND ',' @ ') NOT LIKE '%@%' 
BEGIn
    PRINT(@Condition1);
END
ELSE IF REPLACE(REPLACE(@Condition2,' OR ',' @ '),' AND ',' @ ') NOT LIKE '%@%'  
BEGIn
    PRINT(@Condition2);
END
ELSE
BEGIN
    PRINT('none');
END

尝试了以下操作并完成了工作

DECLARE @Condition varchar(max) = 'Number =''12908,13232323,12122'' AND Name=''Mak'''

DECLARE @Condition1 varchar(max) = 'Address=''UK'' OR Number =''12908'' AND Name=''Mak'''

DECLARE @Condition2 varchar(max) = 'Number =''12908,13232323'''

IF REPLACE(REPLACE(@Condition,' OR ',' @ '),' AND ',' @ ') NOT LIKE '%@%' 
BEGIN
    PRINT(@Condition);
END
ELSE IF REPLACE(REPLACE(@Condition1,' OR ',' @ '),' AND ',' @ ') NOT LIKE '%@%' 
BEGIn
    PRINT(@Condition1);
END
ELSE IF REPLACE(REPLACE(@Condition2,' OR ',' @ '),' AND ',' @ ') NOT LIKE '%@%'  
BEGIn
    PRINT(@Condition2);
END
ELSE
BEGIN
    PRINT('none');
END

使用Like查找没有“AND”的“Number”

DECLARE @Condition varchar(max) = 'Number =''12908,13232323,12122'' AND Name=''Mak'''
DECLARE @Condition1 varchar(max) = 'Address=''UK'' AND Number =''12908'' AND Name=''Mak'''
DECLARE @Condition2 varchar(max) = 'Number =''12908,13232323'''
质疑


使用Like查找没有“AND”的“Number”

DECLARE @Condition varchar(max) = 'Number =''12908,13232323,12122'' AND Name=''Mak'''
DECLARE @Condition1 varchar(max) = 'Address=''UK'' AND Number =''12908'' AND Name=''Mak'''
DECLARE @Condition2 varchar(max) = 'Number =''12908,13232323'''
质疑


SQL Server不是你的朋友;对字符串的处理很糟糕。如果你需要这样做,在你的应用程序是正确的地方。这(事实上)给人一种XY问题的感觉。可能过于简单化了,但仅仅寻找包含单词“Number”而不是单词“and”的条件就足够了吗?SQL Server不是你的朋友;对字符串的处理很糟糕。如果你需要这样做,在你的应用程序是正确的地方。这(事实上)给人一种XY问题的感觉。也许是过于简单化了,但仅仅寻找包含单词“Number”而不是单词“and”的条件就足够了吗?