Весь ваш код может быть таким простым:
let number = Int.random(in: 0 ..< 37)
let color = Int.random(in: 1 ..< 3)
print("The Number is \(number) and the color is \(color == 1 ? "Red" : "Black")")
Вот и все. Нет необходимости в кортеже или в switch
.
Хотя решение John Sansom работает, существует другой способ сделать, это, не имея необходимость использовать потенциально неэффективный скаляр оценило UDF. В отчете о SSRS, на вкладке параметров определения запроса, устанавливает значение параметра на
=join(Parameters!<your param name>.Value,",")
В Вашем запросе, можно затем сослаться на значение как так:
where yourColumn in (@<your param name>)
Просто комментарий - я побежал на мир вреда, пытающегося заставить В пункте работать в соединении с Oracle 10 г. Я не думаю, что переписанный запрос может быть правильно передан 10-граммовому дб. Я должен был отбросить мультизначение полностью. Запрос возвратил бы данные только, когда единственное значение (от селектора мультипараметра, передаваемого по значению) было выбрано. Я попробовал MS и драйверы Oracle с теми же результатами. Я хотел бы услышать, имел ли кто-либо успех с этим.
Это - одна из плохих поддерживавших функций в SQL Reporting Services.
то, Что необходимо сделать, передать все выбранные пункты как единственная строка к хранимой процедуре. Каждый элемент в строке будет разделен запятой.
то, Что я затем делаю, разделяется строка с помощью функции, которая возвращает обеспеченную строку как таблицу. Посмотрите ниже.
ALTER FUNCTION [dbo].[fn_MVParam]
(@RepParam nvarchar(4000), @Delim char(1)= ',')
RETURNS @Values TABLE (Param nvarchar(4000))AS
BEGIN
DECLARE @chrind INT
DECLARE @Piece nvarchar(100)
SELECT @chrind = 1
WHILE @chrind > 0
BEGIN
SELECT @chrind = CHARINDEX(@Delim,@RepParam)
IF @chrind > 0
SELECT @Piece = LEFT(@RepParam,@chrind - 1)
ELSE
SELECT @Piece = @RepParam
INSERT @Values(Param) VALUES(CAST(@Piece AS VARCHAR))
SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam) - @chrind)
IF LEN(@RepParam) = 0 BREAK
END
RETURN
END
можно затем сослаться на результаты в где пункт основного запроса как так:
where someColumn IN(SELECT Param FROM dbo.fn_MVParam(@sParameterString,','))
я надеюсь это, Вы находите это решение быть полезными. Не стесняйтесь ставить любые вопросы, которые Вы можете иметь.
С наилучшими пожеланиями, John
Это - то, что я использую при передаче мультиизбранного параметрического усилителя другому мультиизбранному параметрическому усилителю.
=SPLIT(JOIN(Parameters!<your param name>.Value,","),",")
ORACLE:
Фраза «IN» (решение Эда) не будет работать против соединения Oracle ( хотя бы версия 10). Однако нашел этот простой способ обхода. Используя вкладку параметров набора данных, превратите многозначный параметр в CSV:
:name =join(Parameters!name.Value,",")
Затем в предложении WHERE вашего SQL-оператора используйте функцию instring для проверки совпадения.
INSTR(:name, TABLE.FILENAME) > 0
У Джона Сансома и Эда Харпера отличные решения. Однако я не смог заставить их работать при работе с полями идентификаторов (т.е. целыми числами). Я изменил приведенную ниже функцию разделения, чтобы ПРИВЕСТИ значения в виде целых чисел, чтобы таблица соединялась со столбцами первичного ключа. Я также прокомментировал код и добавил столбец для порядка, на случай, если порядок разграниченных списков был значительным.
CREATE FUNCTION [dbo].[fn_SplitInt]
(
@List nvarchar(4000),
@Delimiter char(1)= ','
)
RETURNS @Values TABLE
(
Position int IDENTITY PRIMARY KEY,
Number int
)
AS
BEGIN
-- set up working variables
DECLARE @Index INT
DECLARE @ItemValue nvarchar(100)
SELECT @Index = 1
-- iterate until we have no more characters to work with
WHILE @Index > 0
BEGIN
-- find first delimiter
SELECT @Index = CHARINDEX(@Delimiter,@List)
-- extract the item value
IF @Index > 0 -- if found, take the value left of the delimiter
SELECT @ItemValue = LEFT(@List,@Index - 1)
ELSE -- if none, take the remainder as the last value
SELECT @ItemValue = @List
-- insert the value into our new table
INSERT INTO @Values (Number) VALUES (CAST(@ItemValue AS int))
-- remove the found item from the working list
SELECT @List = RIGHT(@List,LEN(@List) - @Index)
-- if list is empty, we are done
IF LEN(@List) = 0 BREAK
END
RETURN
END
Используйте эту функцию, как отмечалось ранее:
WHERE id IN (SELECT Number FROM dbo.fn_SplitInt(@sParameterString,','))