Фильтрация столбца идентификатора по диапазону значений - PullRequest
1 голос
/ 11 апреля 2011

У меня есть следующий SQL:

SELECT ',' + LTRIM(RTRIM(CAST(vessel_is_id as CHAR(2)))) + ',' AS 'Id'
FROM Vessels
WHERE ',' + LTRIM(RTRIM(CAST(vessel_is_id as varCHAR(2)))) + ',' IN (',1,2,3,4,5,6,')

По сути, я хочу отфильтровать vessel_is_id по переменному списку целочисленных значений (который передается как varchar в хранимый процесс),Теперь вышеприведенный SQL не работает.У меня есть строки в таблице с параметром «vessel__is_id», равным 1, но они не возвращаются.

Может кто-нибудь предложить мне лучший подход к этому?Или, если выше, все в порядке

РЕДАКТИРОВАТЬ:

Пример данных

| vessel_is_id |
| ------------ |
|      1       |
|      2       |
|      5       |
|      3       |
|      1       |
|      1       |

Поэтому я хочу вернуть все выше, где vessel_is_id находится в фильтре переменныхто есть '1,3' - который должен вернуть 4 записи.

Приветствия.Иак.

Ответы [ 2 ]

1 голос
/ 11 апреля 2011
IF OBJECT_ID(N'dbo.fn_ArrayToTable',N'FN') IS NOT NULL
    DROP FUNCTION [dbo].[fn_ArrayToTable]
GO
CREATE FUNCTION [dbo].fn_ArrayToTable (@array VARCHAR(MAX))
-- =============================================
-- Author:      Dan Andrews
-- Create date: 04/11/11
-- Description: String to Tabled-Valued Function
--
-- =============================================
RETURNS @output TABLE (data VARCHAR(256))
AS 
BEGIN

    DECLARE @pointer INT
    SET @pointer = CHARINDEX(',', @array)

    WHILE @pointer != 0
    BEGIN
        INSERT INTO @output
        SELECT RTRIM(LTRIM(LEFT(@array,@pointer-1)))

        SELECT  @array = RIGHT(@array, LEN(@array)-@pointer), 
                @pointer = CHARINDEX(',', @array)
    END

    RETURN
END

К которым вы можете подать заявку:

SELECT * FROM dbo.fn_ArrayToTable('2,3,4,5,2,2')

а в вашем случае:

SELECT  LTRIM(RTRIM(CAST(vessel_is_id AS CHAR(2)))) AS 'Id'      
FROM Vessels      
WHERE    LTRIM(RTRIM(CAST(vessel_is_id AS VARCHAR(2)))) IN (SELECT data FROM dbo.fn_ArrayToTable('1,2,3,4,5,6')
0 голосов
/ 11 апреля 2011

Поскольку сервер Sql не имеет массива, возможно, вы захотите передать набор значений в виде типа XML. Затем вы можете превратить тип XML в отношение и присоединиться к нему. Опираясь на проверенную временем базу данных пабов, например. Конечно, ваш клиент может или не может легко генерировать XML для значения параметра, но этот подход защищен от sql-инъекций, которые не подходят большинству подходов с разделением запятыми.

declare @stateSelector xml
set @stateSelector = '<values>
<value>or</value>
<value>ut</value>
<value>tn</value>
</values>'

select * from authors 
where state in ( select c.value('.', 'varchar(2)') from @stateSelector.nodes('//value') as t(c))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...