2017-09-18 4 views
0

Ich habe so oft versucht, aber konnte die genaue Abfrage noch nicht finden. Der eine, den ich gemacht habe, arbeitet in wenigen Strings, funktioniert aber nicht in einem anderen (es ist ungewiss).Finden Sie ein Wort in einer Zeichenfolge mit einem Zeichen

Was ich will ist das Wort, das darin hat wie "abcde sfjhjk.dkjb sajb njdhf", was ich will, ist als Ergebnis. Dies ist nur ein Beispiel.

Die Abfrage gibt in einigen Fällen alle Buchstaben zurück, während in anderen Fällen einige Ziffern abgeschnitten werden. Sie können dies überprüfen, indem Sie verschiedene Werte angeben.

Ich versuchte unter:
Dies funktioniert nicht:

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 

Dies funktioniert:

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 

Kann jemand bitte helfen.

+1

Mein Ansatz wäre, eine temporäre Tabelle zu erstellen, die Indizes aller Leerzeichen in einer Zeichenfolge speichert. Dann fragen Sie nach einem Punkt und im Ergebnis können Sie mit einem einfachen Teilstring extrahieren, was Sie brauchen. Umkehr ist immer schwierig. – PacoDePaco

+0

Ich mochte Ihre Idee @PacoDePaco Ich werde dafür gehen und überprüfen, ob es funktioniert :) –

Antwort

1

Ich würde zuerst eine SplitString-Funktion verwenden (eine Leerstelle als Trennzeichen übergeben), die jedes Wort in einer Zeichenfolge als Zeilen zurückgibt und es dann so filtert, dass nur die Wörter mit einem Punkt zurückgegeben werden.

SQL Server 2016 hat bereits ein https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql und auf älteren SQL Server können Sie bauen Ihre eigene: 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

Ordnung nur zum Spaß

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

Unnötig ich zu sagen würde, diese Option nicht empfehlen weil es wirklich schwer ist zu pflegen. Wie Marc sagte, ist es die beste Option, die Zeichenfolge für Leerzeichen aufzuteilen und die mit einem '.'

Nun, wenn Sie 2016 haben SQLServer nicht hier ist eine Split-Funktion für Sie:

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 

Und als solche verwendet werden:

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

Beachten Sie, dass i-Rohlinge durch einen anderen Wert ersetzen.

Verwandte Themen