SELECT COLUMN_A, COLUMN_B, COLUMN_C
FROM MY_TABLE
WHERE SOMETHING IN ('10', '20', '30', '40', '50', '60', '10');
由于值“ 10”是重复项,所以我只得到6行数据,而不是所需的7行数据。我需要返回值('10','20','30','40','50','60','10')中的每个值的结果。
我如何才能获得2行数据,而不是1行呢?尽管这似乎不切实际,但这正是我需要做的。非常感谢您的协助。
答案 0 :(得分:1)
您可以使用UNION ALL
合并多个查询。
SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE WHERE SOMETHING = '10'
union all
SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE WHERE SOMETHING = '20'
union all
SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE WHERE SOMETHING = '30'
union all
SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE WHERE SOMETHING = '40'
union all
SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE WHERE SOMETHING = '50'
union all
SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE WHERE SOMETHING = '60'
union all
SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE WHERE SOMETHING = '10'
无论如何,我不清楚您为什么需要这样做。此外,即使在SOMETHING
上有索引,它在数据库负载和性能方面也不是很有效。
答案 1 :(得分:1)
您可以像这样使用UNION ALL
:
SELECT COLUMN_A,
COLUMN_B,
COLUMN_C
FROM MY_TABLE
WHERE SOMETHING IN ('10',
...
'60')
UNION ALL
SELECT COLUMN_A,
COLUMN_B,
COLUMN_C
FROM MY_TABLE
WHERE SOMETHING IN ('10');
或者您可以使用过滤器值创建一个临时表并将其联接:
CREATE GLOBAL TEMPORARY TABLE SOMETHINGS
AS
SELECT '10' SOMETHING
FROM DUAL
UNION ALL
...
UNION ALL
SELECT '10' SOMETHING
FROM DUAL;
SELECT COLUMN_A,
COLUMN_B,
COLUMN_C
FROM MY_TABLE
INNER JOIN SOMETHINGS
ON SOMETHINGS.SOMETHING = MY_TABLE.SOMETHING;
DROP TABLE SOMETHINGS;
答案 2 :(得分:1)
您可以这样做。
该字符串将转换为嵌套表查询,然后您对该字符串进行联接。
SELECT *
FROM
(
select
trim(regexp_substr(t.MESSAGES, '[^,]+', 1, levels.column_value)) as SPLIT_MESSAGE
from
(SELECT '10, 20, 30, 40, 50, 60, 10' MESSAGES FROM DUAL) t,
table(cast(multiset(select level from dual connect by level <= length (regexp_replace(t.MESSAGES, '[^,]+')) + 1) as sys.OdciNumberList)) levels
) A
INNER JOIN MY_TABLE ON MY_TABLE.SOMETHING=A.SPLIT_MESSAGE
答案 3 :(得分:0)
您可以使用join实现此目的。首先将IN CLAUSE中用逗号分隔的值拆分为表格形式,然后将join与您的表格一起使用。
可以使用MSDN https://blogs.msdn.microsoft.com/amitjet/2009/12/11/convert-comma-separated-string-to-table-4-different-approaches/的拆分功能 下面的示例代码:我使用CTE方法进行拆分
DECLARE @PARAMS VARCHAR(50)='10, 20, 30, 40, 50, 60, 10'
;WITH STRCTE(START, STOP) AS
(
SELECT 1, CHARINDEX(',' , @PARAMS )
UNION ALL
SELECT STOP + 1, CHARINDEX(',' ,@PARAMS , STOP + 1)
FROM STRCTE
WHERE STOP > 0
)
SELECT SUBSTRING(@PARAMS , START, CASE WHEN STOP > 0 THEN STOP-START ELSE 4000 END) AS STRINGVALUE INTO #TEMP FROM STRCTE
SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE INNER JOIN #TEMP ON SOMETHING = STRINGVALUE