2009-04-15 3 views
0

私はこのステートメントをT-SQLに書いています。T-SQLで文字列分割を実装して適用する

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

私は彼らがuidは、このような数字の文字列に等しいTABLEから "複数の" BAY Sを選択しています:

B_Numbers = 1:45:34:98 

したがって、私はTABLEから4つの異なるBAY Sを選択する必要があります。私は基本的に文字列1:45:34:98を4つの異なる数字に分割する必要があります。

私はSplit()が動作すると思っていますが、そうではなく、構文エラーが発生します。 T-SQL神の考えは素晴らしいでしょう!

答えて

0

あなたは配列を行として保つべきですが、私があなたの質問を理解すれば、これはうまくいくと思います。

SELECT 
    Bay 

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

where 
    Info_Step.uid = 'number' 

このクエリは、like演算子のために全テーブルスキャンを行います。ここで

+0

入力文字列をトークンに分割する必要がありますので、これは動作しませんが(4異なる行)とテーブルは一緒に結合されます。あなたのメソッドは '..... 1:45:34:98 .....'のようなUIDを見つけようとします.UIDはおそらく整数なので、そうではありません。 – beach

0

とは何のことができます。 doはB_Numbersのエントリをループし、独自の分割を実行します:これらのエントリを一時テーブルに挿入し、クエリを実行します。ここ

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

は、入力された文字列を解析するために補助番号テーブルを使用する方法です。ロジックはテーブルを返す関数に簡単に追加できます。そのテーブルを結合して、正しい行を検索することができます。

ステップ1:数字テーブルを作成します

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 

ステップ2:入力文字列を解析

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',':') 

ステップ3:あなたは/必要

をしたいが、結果を使用します
Number 
------ 
1 
34 
45 
98 

エンドツーエンドの例

適切なBNumber(もちろんコメントアウト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 

返すために使用する機能を使用を返す関数を作成します。望ましい結果

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

結果

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

あなたも、この

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 

出力試すことができます。

Bay1 Bay2 Bay3 Bay4 
1 45 34 98 
関連する問題