2015-11-23 2 views
0

У меня есть небольшая проблема, с которой я мог бы легко справиться на C#, но меня попросили сделать это в SQL.Проверка наличия значения в столбце, разделенном двоеточием, в таблице

У меня есть хранимая процедура, которая принимает значение int в качестве параметра, и мне нужно проверить, находится ли этот параметр внутри значения столбца, разделенного двоеточием в базе данных.

(
           (
            gvf_permitted_projects is null 
           ) 
           or 
           ( -- @activeProject IN gvf_permitted_projects 
            -- @activeProject = 11 
            -- gvf_permitted_projects = '11:17' 
           ) 
          ) 

Это внутри, где положение моего SELECT, я мог бы сделать это в C# с минимальными усилиями, но я не слишком уверен, как сделать это здесь. Нужно ли использовать временную таблицу, а затем сделать выбор?

+1

Как колонка, разделенная двоеточием, в базе данных, последующий конкретный заказ. Образец входных данных с случаем поможет. – Abhishek

+2

Вы можете использовать пользовательскую функцию разделения T-SQL. Оформить этот ответ http://stackoverflow.com/questions/10914576/t-sql-split-string – cleftheris

+1

это так, как показано в комментариях, 11:17 Цифры, выбранные там, являются просто примерами. Но я бы хотел, чтобы он возвращал true, поскольку 11 находится в lsit –

ответ

0

Вы можете использовать как оператор с некоторой обработки текста, хотя это будет довольно медленно и нормализуется структура будет предпочтительнее в любом случае:

':'[email protected]_permitted_projects+':' like '%:'+cast(@activeProject as varchar(20))+':%' 
0

Таким образом, вам придется разделить строку на столбцы. Если вы не можете использовать функции, вы можете использовать это: Splitting Delimited Strings Using XML in SQL Server

Быстрый демо, как это работает:

DECLARE @xml AS XML 
    , @str AS VARCHAR(100) 
    , @delimiter AS VARCHAR(1) 

SET @str = '11:17' 
SET @delimiter = ':' 
SET @xml = cast(('<X>' + replace(@str, @delimiter, '</X><X>') + '</X>') AS XML) 

SELECT N.value('.', 'varchar(10)') AS value 
FROM @xml.nodes('X') AS T(N) 

Он возвращает это:

╔═══════╗ 
║ value ║ 
╠═══════╣ 
║ 11 ║ 
║ 17 ║ 
╚═══════╝ 

Так это будет ваш SQL:

DECLARE @YourTable TABLE 
(
    Id INT 
    , gvf_permitted_projects VARCHAR(100) 
); 

INSERT INTO @YourTable (Id, gvf_permitted_projects) 
VALUES (1, '11:17') 
    , (2, '11:13') 
    , (3, '12:17'); 

SELECT * 
FROM @YourTable AS YT 
CROSS APPLY (
    SELECT CAST(('<X>' + replace(gvf_permitted_projects , ':', '</X><X>') + '</X>') AS XML) 
    ) AS V(N) 
WHERE EXISTS (
     SELECT 1 
     FROM N.nodes('X') AS T(N) 
     WHERE N.value('.', 'INT') = 11 
     ); 

Вот результат:

╔════╦════════════════════════╦════════════════════╗ 
║ Id ║ gvf_permitted_projects ║   N   ║ 
╠════╬════════════════════════╬════════════════════╣ 
║ 1 ║ 11:17     ║ <X>11</X><X>17</X> ║ 
║ 2 ║ 11:13     ║ <X>11</X><X>13</X> ║ 
╚════╩════════════════════════╩════════════════════╝ 

Хотя, я настоятельно рекомендую нормализовать структуру данных. Это всего лишь обходной путь.

0

В этом ответе я добавил некоторые интересные трюки вы можете сделать с XML и строковые значения:

https://stackoverflow.com/a/33658220/5089204

Перейти в раздел "Dynamic IN". Надеюсь это поможет.

Смежные вопросы