2009-04-15 7 views
0

J'ai cette instruction dans T-SQL.Implémentation et application d'une division de chaîne dans T-SQL

SELECT Bay From TABLE where uid in (
    select B_Numbers from Info_Step WHERE uid = 'number' 
) 

Je sélectionnant "plusieurs" BAY s de TABLE où leur uid est égale à une chaîne de nombres comme ceci:

B_Numbers = 1:45:34:98 

Par conséquent, je devrais sélectionner 4 différents BAY s de TABLE. J'ai fondamentalement besoin de diviser la chaîne 1:45:34:98 en 4 nombres différents.

Je pense que Split() fonctionnerait, mais ce n'est pas le cas et j'obtiens une erreur de syntaxe. Toutes les pensées des dieux T-SQL seraient géniales!

Répondre

0

Vous devriez garder vos tableaux sous forme de lignes, mais si je comprends votre question, je pense que cela fonctionnera.

SELECT 
    Bay 

From 
    TABLE 
    join Info_Step 
    on B_Numbers like '%'+ uid +'%' 

where 
    Info_Step.uid = 'number' 

Cette requête effectue une analyse de table complète en raison de l'opérateur similaire.

+0

Cela ne fonctionnera pas parce que la chaîne d'entrée doit être séparée en jetons (4 lignes différentes) et puis les tables réunies. Votre méthode va essayer de trouver un UID comme '..... 1: 45: 34: 98 .....', ce qui n'est pas le cas car l'UID est probablement un nombre entier. – beach

0

Qu'est-ce que vous pouvez do est la boucle à travers les B_Numbers entrées et faire votre propre split sur : Insérez ces entrées dans une table temporaire, puis effectuez votre requête.

DECLARE @i    int 
DECLARE @start   int 
DECLARE @B_Numbers  nvarchar(20) 
DECLARE @temp   table (
    number nvarchar(10) 
) 

-- SELECT B_Numbers FROM Info_Step WHERE uid = 'number' 
SELECT @B_Numbers = '1:45:34:98' 

SET @i = 0 
SET @start = 0 

-- Parse out characters delimited by ":"; 
-- Would make a nice user defined function. 
WHILE @i < len(@B_Numbers) 
BEGIN 
    IF substring(@B_Numbers, @i, 1) = ':' 
    BEGIN 
     INSERT INTO @temp 
     VALUES (substring(@B_Numbers, @start, @i - @start)) 
     SET @start = @i + 1 
    END 

    SET @i = @i + 1 
END 

-- Insert last item 
INSERT INTO @temp 
VALUES (substring(@B_Numbers, @start, @i - @start + 1)) 

-- Do query with parsed values 
SELECT Bay FROM TABLE WHERE uid in (SELECT * FROM @temp) 
2

Voici une méthode qui utilise une table de nombres auxiliaires pour analyser la chaîne d'entrée. La logique peut facilement être ajoutée à une fonction qui renvoie une table. Cette table peut ensuite être jointe pour rechercher les lignes correctes.

Étape 1: Créer la table Numéros

SET NOCOUNT ON 
GO 

IF EXISTS 
(
    SELECT 1 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE  TABLE_NAME = 'Numbers' 
      AND  TABLE_SCHEMA = 'dbo' 
      AND  TABLE_TYPE = 'BASE TABLE' 
) 
BEGIN 
    DROP TABLE dbo.Numbers 
END 
GO 

CREATE TABLE dbo.Numbers 
(
    Number smallint IDENTITY(1, 1) PRIMARY KEY 
) 
GO 

WHILE 1 = 1 
BEGIN 
    INSERT INTO dbo.Numbers DEFAULT VALUES 

    IF SCOPE_IDENTITY() = 32767 
    BEGIN 
     BREAK 
    END 
END 
GO 

Étape 2: Parse la chaîne d'entrée

CREATE FUNCTION dbo.ParseString(@input_string varchar(8000), @delim varchar(8000) = " ") 
RETURNS TABLE 
AS RETURN 
(
    SELECT Number 
    FROM dbo.Numbers 
    WHERE CHARINDEX 
    ( 
     @delim + CONVERT(VARCHAR(12),Number) + @delim, 
     @delim + @input_string + @delim 
    ) > 0 
) 
GO 

**EXAMPLE** 
SELECT * FROM dbo.ParseString('1:45:34:98',':') 

Étape 3: Utiliser les résultats mais vous voulez/besoin

Number 
------ 
1 
34 
45 
98 

de bout en bout Exemple

Créer fonction qui renvoie la BNumber appropriée (bien sûr changer d'utiliser l'commenté SQL)

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE FUNCTION dbo.GetBNumber (@uid int) 
RETURNS VARCHAR(8000) 
AS 
BEGIN 
    RETURN '1:45:34:98' 
    --select B_Numbers from Info_Step WHERE uid = @uid 
END 
GO 

Utilisez les fonctions d'utilisation pour retourner le résultats souhaités

-- Using Test Data 
SELECT N.Number FROM Numbers N 
JOIN dbo.ParseString(dbo.GetBNumber(12345),':') Q ON Q.Number = N.Number 

-- Using Your Data (Untested but should work.) 
SELECT N.Bay 
FROM TABLE N 
JOIN dbo.ParseString(dbo.GetBNumber(ENTER YOU NUMBER HERE),':') Q ON Q.Number = N.uid 

résultats

Number 
------ 
1 
34 
45 
98 
0

Vous pouvez même essayer

declare @str varchar(50) 
set @str = '1:45:34:98' 

;with numcte as(
select 1 as rn union all select rn+1 from numcte where rn<LEN(@str)), 
getchars as(select 
ROW_NUMBER() over(order by rn) slno, 
rn,chars from numcte 
cross apply(select SUBSTRING(@str,rn,1) chars)X where chars = ':') 

select top 1 
    Bay1 = SUBSTRING(@str,0,(select rn from getchars where slno = 1)) 
    ,Bay2 = SUBSTRING(@str, 
      (select rn from getchars where slno = 1) + 1, 
      (((select rn from getchars where slno = 2)- 
      (select rn from getchars where slno = 1) 
      )-1)) 
    ,Bay3 = SUBSTRING(@str, 
      (select rn from getchars where slno = 2) + 1, 
      (((select rn from getchars where slno = 3)- 
      (select rn from getchars where slno = 2) 
      )-1)) 
    ,Bay4 = SUBSTRING(@str, 
      (select rn from getchars where slno = 3)+1, 
      LEN(@str)) 
    from getchars 

Sortie:

Bay1 Bay2 Bay3 Bay4 
1 45 34 98 
Questions connexes