标准与IN()语句不匹配的空白结果

时间:2015-12-04 19:22:47

标签: sql intersystems-cache

我有一大堆ID,我需要从数据库中填充一些信息。我希望我的查询结果能够显示数据中的空白。这很难描述,但鉴于这些数据:

Sample data

这个查询:

SELECT ID, Name, Color FROM myTable
WHERE ID IN ('1','2','3','4','5','6','7')

我想要这些结果:

enter image description here

这可能吗?

2 个答案:

答案 0 :(得分:2)

使用功能......

CREATE FUNCTION dbo.BreakStringIntoRows (@CommadelimitedString   varchar(1000))
RETURNS   @Result TABLE (Ret VARCHAR(100))
AS
BEGIN
        DECLARE @IntLocation INT
        WHILE (CHARINDEX(',',    @CommadelimitedString, 0) > 0)
        BEGIN
              SET @IntLocation =   CHARINDEX(',',    @CommadelimitedString, 0)      
              INSERT INTO   @Result (Ret)
              --LTRIM and RTRIM to ensure blank spaces are   removed
              SELECT RTRIM(LTRIM(SUBSTRING(@CommadelimitedString,   0, @IntLocation)))   
              SET @CommadelimitedString = STUFF(@CommadelimitedString,   1, @IntLocation,   '') 
        END
        INSERT INTO   @Result (Ret)
        SELECT RTRIM(LTRIM(@CommadelimitedString))--LTRIM and RTRIM to ensure blank spaces are removed
        RETURN 
END

选择语句

SELECT 
    Id = B.Ret, 
    Name = ISNULL(T.Name, ''), 
    Color = ISNULL(T.Color, '') 
FROM dbo.BreakStringIntoRows('1,2,3,4,5,6,7') AS B
LEFT JOIN myTable T ON B.Ret = T.Id

结果

Result

希望它有所帮助。

答案 1 :(得分:1)

您可以使用递归CTE创建值表,然后连接到该表以查找缺失值。

;with CTE AS (
SELECT 1 AS col_

UNION ALL 

SELECT 1 + col_
FROM cte

WHERE col_ <100
)

SELECT col_, mt.*
FROM cte

LEFT JOIN myTable mt
ON mt.id = col_