我已经尝试了很多次但是找不到确切的查询。 我制作的那个用很少的字符串工作但在另一个字母中不起作用(这是不确定的)。
我想要的是'.'
中包含"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
任何人都可以帮忙。
答案 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
请注意,我用其他值替换空格。