2017-09-18 29 views
0

私は何度も試してみましたが、正確なクエリはまだ見つかりませんでした。 私が作ったものは数文字列で動作しますが、別の文字列では動作しません(不確実です)。文字で文字列内の単語を検索

"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 @[email protected],@NAME,REVERSE(LEFT(REVERSE(@ALIAS),LEN(@ALIAS)-1)) 
SET @QUERY=REPLACE(@QUERY,@[email protected],'') 
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 @[email protected],@NAME,REVERSE(LEFT(REVERSE(@ALIAS),LEN(@ALIAS)-1)) 
SET @QUERY=REPLACE(@QUERY,@[email protected],'') 
END 

SELECT * FROM @COLUMNS_JOIN 

誰も助けてください。

+1

私のアプローチは、文字列内のすべての空白文字のインデックスを格納する一時テーブルを作成することです。次に、ドットを照会すると、必要なものを単純な部分文字列で抽出することができます。逆転は常に難しいです。 – PacoDePaco

+0

私はあなたのアイデアを好きでした@PacoDePaco 私はそれのために行くとそれが動作するかどうか調べる:) –

答えて

1

文字列の各単語を行として返すSplitString関数(空白を区切り文字として渡します)を使用してから、それをフィルタリングしてドットが付いた単語だけを返します。

のSQL Server 2016既に持っている1 https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql、あなたが構築することができ、古いSQLサーバーで独自:ちょうど楽しみのため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

よし

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

私は、このオプションをお勧めしません言うまでもなくそれは維持することが本当に難しいからです。マークが言ったように、あなたの最善の選択肢は空白のためにあなたの文字列を分割し、 '。'

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 

(注)ここでのSQLServer 2016を持っていけない場合

は今、あなたのためにsplit関数です。

関連する問題