在包含字符

时间:2017-09-18 06:10:45

标签: sql-server tsql

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

我想要的是'.'中包含"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

任何人都可以帮忙。

2 个答案:

答案 0 :(得分:1)

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

SQL Server 2016已经有一个https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql,在较旧的SQL Server上,您可以构建自己的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

答案 1 :(得分:1)

好的只是为了好玩

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

请注意,我用其他值替换空格。