AZ93 Ответов: 2

Передача парамтера, в котором есть запятая


Ниже приведен мой стол:

Таблица 1
facility | CPTCode
1        | 45
2        | 46
3        |456,678


Теперь у меня есть еще одна таблица, которая считывает значения из этой таблицы и генерирует другой отчет. Так что для объектов 1 и 2 это довольно прямолинейно

ТЕСТОВАЯ ТАБЛИЦА
facility | CPTCode |Something
1        | 45      |Apple
2        | 46      |Orange
3        | 456     |Banana
3        | 678     |Strawberry

select * from TEST 
where facility = '1' and CPTCode = 45

но как мне написать свой запрос, где он заботится о запятых
Запрос должен быть таким
Select * from TEST 
where facility = '3' and CPTCode in('456','678')

Как мне написать это в sql?
SELECT facility , TxnSerDate, TxnBchDate, TxnProcedure, TxnAmount, CPTCode 	
FROM TEST  
where facility = @facility  and CPTCode = @CptCode

Нужна помощь в написании
SELECT facility , TxnSerDate, TxnBchDate, TxnProcedure, TxnAmount, CPTCode 	
FROM TEST  
where facility = @facility  and CPTCode = @CptCode = @CPTCode statement


Что я уже пробовал:

SELECT facility , TxnSerDate, TxnBchDate, TxnProcedure, TxnAmount, CPTCode 	
FROM TEST  
where facility = @facility  and CPTCode = @CptCode

2 Ответов

Рейтинг:
2

Wendelius

Вместо того чтобы хранить несколько внешних ключей в одном столбце, я бы рекомендовал добавить таблицу соединений, в которой каждый ключ хранится в отдельной строке. Видеть Многие-ко-многим (модель данных) - Википедия[^]

Используя таблицу соединений ваш запрос будет просто выглядеть примерно так

SELECT ...
FROM Table1,
     JunctionTable1,
     Test
WHERE JunctionTable1.Facility = Table1.Facility
AND   JunctionTable1.CptCode = Test.CptCode


Рейтинг:
0

Bryian Tan

Хорошо. Исходя из того, что представлено. Я предполагаю, что в хранимой процедуре есть параметр типа '456,678', и вы хотите поместить этот параметр в запрос и ожидать, что запрос вернет строки с CPTCode 456 и 678? Если это так, то вот вам пример.

DECLARE @temp TABLE  (
 Facility INT IDENTITY(1,1),
 CPTCode VARCHAR(30),
 Something VARCHAR(50)
)

INSERT INTO @temp
	SELECT 45, 'Apple' UNION
	SELECT 46, 'Orange' UNION
	SELECT 456, 'Pear' UNION
	SELECT 577, 'Banana' UNION
	SELECT 678, 'Strawberry'

	--parameter
DECLARE @CptCode  VARCHAR(30)
SET @CptCode  = '45,456,577'

--comma separated string into rows
DECLARE @cptCodeRows TABLE(CPTCode VARCHAR(30));
;WITH CTE_CPTCode
AS
(
    SELECT [xml_val] = CAST('<b>' + REPLACE(@CptCode ,',','</b><b>') + '</b>' AS XML)
)
INSERT INTO @cptCodeRows
	SELECT  
			ProgramId = col.value('.','VARCHAR(30)')
	FROM CTE_CPTCode
	CROSS APPLY [xml_val].nodes('/b') CA(col)

	--get all the records in @CptCode  
SELECT * FROM @temp t JOIN @cptCodeRows c
	ON t.CPTCode = c.CPTCode

Выход:
Facility	CPTCode	  Something	CPTCode
1	        45	      Apple	    45
3	        456	      Pear	    456
4	        577	    Banana	    577