我有隻包含零或1的字符串(VARCHAR(255)
)。
我需要搜索所有位置並將它們返回爲逗號分隔的字符串。 我從https://dba.stackexchange.com/questions/41961/how-to-find-all-positions-of-a-string-within-another-string搜索字符串中char的所有位置,並返回爲逗號分隔的字符串
這裏是我到目前爲止的代碼生成使用的解決方案兩個查詢:
DECLARE @TERM VARCHAR(5);
SET @TERM = '1';
DECLARE @STRING VARCHAR(255);
SET @STRING = '101011011000000000000000000000000000000000000000';
DECLARE @RESULT VARCHAR(100);
SET @RESULT = '';
SELECT
@RESULT = @RESULT + CAST(X.pos AS VARCHAR(10)) + ','
FROM
(SELECT
pos = Number - LEN(@TERM)
FROM
(SELECT
Number
,Item = LTRIM(RTRIM(SUBSTRING(@STRING, Number, CHARINDEX(@TERM, @STRING + @TERM, Number) - Number)))
FROM
(SELECT ROW_NUMBER() OVER (ORDER BY [object_id]) FROM sys.all_objects
) AS n (Number)
WHERE
Number > 1
AND Number <= CONVERT(INT, LEN(@STRING))
AND SUBSTRING(@TERM + @STRING, Number, LEN(@TERM)) = @TERM
) AS y
) X;
SELECT
SUBSTRING(@RESULT, 0, LEN(@RESULT));
DECLARE @POS INT;
DECLARE @OLD_POS INT;
DECLARE @POSITIONS VARCHAR(100);
SELECT
@POSITIONS = '';
SELECT
@OLD_POS = 0;
SELECT
@POS = PATINDEX('%1%', @STRING);
WHILE @POS > 0
AND @OLD_POS <> @POS
BEGIN
SELECT
@POSITIONS = @POSITIONS + CAST(@POS AS VARCHAR(2)) + ',';
SELECT
@OLD_POS = @POS;
SELECT
@POS = PATINDEX('%1%', SUBSTRING(@STRING, @POS + 1, LEN(@STRING))) + @POS;
END;
SELECT
LEFT(@POSITIONS, LEN(@POSITIONS) - 1);
我想知道如果這是可以做到更快/更好?我只搜索單個字符位置,並且只有兩個字符可以出現在我的字符串(0和1)中。
我已經使用這段代碼構建了兩個函數,並且爲它們運行了1000條記錄,並且在同一時間得到了相同的結果,所以我不知道哪一個更好。
對於單個記錄的第二部分給CPU和讀取等於0在Profiler中,其中第一段代碼給我CPU = 16和讀取= 17。
我需要得到如下結果:1,3,5,6,8,9
(多次出現時),3
單次出現,NONE
如果沒有出現。
這個_have_要在SQL中完成嗎?識別所有'1'位置的目的是什麼? –
理想情況下,更改所需的輸出以及可能的存儲設計。如果您需要處理多個值,逗號分隔的值填充到字符串中應該是* last *手段。 SQL Server具有用於保存多個值的* * *類型,例如* tables *和XML。 –
@DStanley我有表中有選項。有100列。這是一個非常古老的數據庫。對於行,只能有單個值,例如對於行爲單個「1」,但對於舊行,則存在錯誤。我正在創建搜索這些行並列出它們的報告。我已將值轉換爲01字符串,現在我需要知道具有選項號的位置。 – Misiu