【问题标题】:Find word in a string with a character在带有字符的字符串中查找单词
【发布时间】:2017-09-18 21:37:11
【问题描述】:

我已经尝试了很多次,但还没有找到确切的查询。 我制作的那个在几个字符串中工作,但在另一个字符串中不起作用(不确定)。

我想要的是其中包含'.' 的单词,例如"abcde sfjhjk.dkjb sajb njdhf",我想要的是"sfjhjk.dkjb" 作为结果。这只是一个例子。

查询在某些情况下会返回所有字母,而在其他情况下会截断少数数字。您可以通过提供不同的值进行检查。

我在下面尝试过:
这不起作用:

DECLARE @QUERY VARCHAR(MAX)='
               renewreque0_.amount                   AS AMOUNT48_, 
               renewreque0_.charge_type              AS CHARGE3_48_, 
               renewreque0_.commission_rate          AS COMMISSION4_48_
'


SET NOCOUNT ON;

DECLARE @TABLENAME TABLE(TABLE_NAME VARCHAR(MAX),ALIAS VARCHAR(MAX))
DECLARE @COLUMNS_JOIN TABLE(COL VARCHAR(MAX),COLUMN_NAME VARCHAR(MAX),ALIAS VARCHAR(MAX))
DECLARE @NAME VARCHAR(MAX),@ALIAS VARCHAR(MAX),@J_QUERY VARCHAR(MAX),@W_QUERY VARCHAR(MAX)
DECLARE @WHERE_JOIN TABLE(COL VARCHAR(MAX),COLUMN_NAME VARCHAR(MAX),ALIAS VARCHAR(MAX))


 WHILE CHARINDEX('.',@QUERY)>1
BEGIN
SET @NAME = REVERSE( SUBSTRING(REVERSE(@QUERY),CHARINDEX('.',REVERSE(@QUERY))+1,CHARINDEX(' ',@QUERY))  )
SET @ALIAS= REVERSE(LEFT(REVERSE(@QUERY),CHARINDEX('.',REVERSE(@QUERY))))
SET @ALIAS=LEFT(@ALIAS,CHARINDEX(' ',@ALIAS))
SET @NAME=LTRIM(RTRIM(@NAME))
SET @ALIAS=LTRIM(RTRIM(@ALIAS))
INSERT INTO @COLUMNS_JOIN  SELECT @NAME+@ALIAS,@NAME,REVERSE(LEFT(REVERSE(@ALIAS),LEN(@ALIAS)-1))
SET @QUERY=REPLACE(@QUERY,@NAME+@ALIAS,'')
END

SELECT * FROM @COLUMNS_JOIN

这行得通:

DECLARE @QUERY VARCHAR(MAX)='
                   AND t8_.username LIKE ? 
       AND t4_.branch_id = ? 
       AND t1_.account_no = ? 
       AND t0_.remarks = ? 
       AND t0_.collect_from = ? 
'


SET NOCOUNT ON;

DECLARE @TABLENAME TABLE(TABLE_NAME VARCHAR(MAX),ALIAS VARCHAR(MAX))
DECLARE @COLUMNS_JOIN TABLE(COL VARCHAR(MAX),COLUMN_NAME VARCHAR(MAX),ALIAS VARCHAR(MAX))
DECLARE @NAME VARCHAR(MAX),@ALIAS VARCHAR(MAX),@J_QUERY VARCHAR(MAX),@W_QUERY VARCHAR(MAX)
DECLARE @WHERE_JOIN TABLE(COL VARCHAR(MAX),COLUMN_NAME VARCHAR(MAX),ALIAS VARCHAR(MAX))


 WHILE CHARINDEX('.',@QUERY)>1
BEGIN
SET @NAME = REVERSE( SUBSTRING(REVERSE(@QUERY),CHARINDEX('.',REVERSE(@QUERY))+1,CHARINDEX(' ',@QUERY))  )
SET @ALIAS= REVERSE(LEFT(REVERSE(@QUERY),CHARINDEX('.',REVERSE(@QUERY))))
SET @ALIAS=LEFT(@ALIAS,CHARINDEX(' ',@ALIAS))
SET @NAME=LTRIM(RTRIM(@NAME))
SET @ALIAS=LTRIM(RTRIM(@ALIAS))
INSERT INTO @COLUMNS_JOIN  SELECT @NAME+@ALIAS,@NAME,REVERSE(LEFT(REVERSE(@ALIAS),LEN(@ALIAS)-1))
SET @QUERY=REPLACE(@QUERY,@NAME+@ALIAS,'')
END

SELECT * FROM @COLUMNS_JOIN

有人可以帮忙吗。

【问题讨论】:

  • 我的方法是创建一个临时表,将所有空格字符的索引存储在一个字符串中。然后你查询一个点,在结果中你可以用一个简单的子字符串提取你需要的东西。倒车总是很棘手。
  • 我喜欢你的想法@PacoDePaco 我会去看看它是否有效:)

标签: sql-server tsql


【解决方案1】:

我会首先使用一个 SplitString 函数(传递一个空格作为分隔符),它将字符串中的每个单词作为行返回,然后过滤它以仅返回带有点的单词。

SQL Server 2016 已经有一个 https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql,您可以在较旧的 SQL Server 上构建自己的:Splitting the string in sql server

set @SQLStr varchar(512) = 'abcde sfjhjk.dkjb sajb njdhf';

select value from string_split(@SQLStr, ' ')
where charindex('.', value) > 0

【讨论】:

    【解决方案2】:

    好吧,只是为了好玩

    declare @str nvarchar(100) = 'abcde sfjhjk.dkjb sajb njdhf',
            @pointIndex int 
    
     SET @pointIndex = (SELECT CHARINDEX('.',@str) )
    
    SELECT  RTRIM(LTRIM(SUBSTRING(@str, @pointIndex - CHARINDEX(' ',REVERSE(LEFT(@str,@pointIndex))) +1,CHARINDEX(' ',REVERSE(LEFT(@str,@pointIndex)))) -- left side
        +SUBSTRING(@str,@pointIndex +1, CHARINDEX( ' ', SUBSTRING(@str,@pointIndex,len(@str) - @pointIndex) ) -1 )))
    

    不用说我不会推荐这个选项,因为它真的很难维护。正如 Marc 所说,您最好的选择是将您的字符串拆分为空格并找到带有“。”的字符串。

    现在,如果您没有 SQLServer 2016,这里有一个适合您的拆分功能:

    CREATE function [dbo].[Split]
    (
    @string nvarchar(max),
    @delimiter nvarchar(20)
    )
    returns @table table
    (
       [Value] nvarchar(max)
    )
    begin
    declare @nextString nvarchar(max)
    declare @pos int, @nextPos int
    
      set @nextString = ''
      set @string = @string + @delimiter
    
      set @pos = charindex(@delimiter, @string)
      set @nextPos = 1
      while (@pos <> 0)
      begin
          set @nextString = substring(@string, 1, @pos - 1)
    
          insert into @table
          (
              [Value]
          )
          values
          (
              @nextString
          )
    
          set @string = substring(@string, @pos + len(@delimiter), len(@string))
          set @nextPos = @pos
          set @pos = charindex(@delimiter, @string)
      end
      return
    end
    

    然后这样使用它:

    SELECT * FROM dbo.Split(REPLACE(@str,' ','/'),'/')
    WHERE charindex('.', value) > 0
    

    请注意,我将空格替换为另一个值。

    【讨论】:

      猜你喜欢
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多