【问题标题】:Check only specific field present in the string仅检查字符串中存在的特定字段
【发布时间】:2019-02-09 10:04:19
【问题描述】:

如果它包含 only 数字字段,我想打印以下条件字符串之一。

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'

【问题讨论】:

  • SQL Server 不是你的朋友;字符串操作很糟糕。如果你需要做这样的事情,在你的应用程序中是正确的地方。这(实际上)有 XY 问题的感觉。
  • 可能过于简单化了,但仅查找包含单词“Number”而不是单词“AND”的条件就足够了吗?

标签: sql-server sql-server-2008-r2


【解决方案1】:

我使用了一个 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='

可以进行更多调整以排除异常情况,但希望这可以帮助您入门。

【讨论】:

    【解决方案2】:

    使用 Like 查找不带“AND”的“数字”。

    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'''
    

    查询

    Select conditions From (Values (@Condition),(@Condition1),(@Condition2)) c(conditions)
    Where conditions Like '%Number%' And conditions Not Like '%AND%'
    

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-19
        • 2017-12-16
        • 2021-12-05
        • 2011-07-08
        • 2013-10-21
        • 1970-01-01
        相关资源
        最近更新 更多