Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从表中逗号分隔的值中获取单个值_Sql_Sql Server_Database - Fatal编程技术网

Sql 从表中逗号分隔的值中获取单个值

Sql 从表中逗号分隔的值中获取单个值,sql,sql-server,database,Sql,Sql Server,Database,我有一个带有参考值的表和另一个作为选定参考值的表。在该表中,所选参考值以逗号分隔。如何从逗号分隔的值中获取单个值 CREATE TABLE [DBO].[TBL_REFERENCE] ( /* REFERENCE TABLE */ REF_ID BIGINT IDENTITY(1, 1) NOT NULL ,REF_NUMBER INT NOT NULL ,REF_NAME NVARCHAR(20) ,REF_VALUE NVARCHAR(25)

我有一个带有参考值的表和另一个作为选定参考值的表。在该表中,所选参考值以逗号分隔。如何从逗号分隔的值中获取单个值

CREATE TABLE [DBO].[TBL_REFERENCE] 
(
    /* REFERENCE TABLE */
     REF_ID BIGINT IDENTITY(1, 1) NOT NULL
    ,REF_NUMBER INT NOT NULL
    ,REF_NAME NVARCHAR(20)
    ,REF_VALUE NVARCHAR(25)
    ,CONSTRAINT PK_REFERENCE PRIMARY KEY (REF_ID)
)

INSERT INTO TBL_REFERENCE (ref_number, ref_name, ref_value) 
VALUES (1, 'communication', 'mobile'),
       (1, 'communication', 'laptop'),
       (1, 'communication', 'PDA'),
       (1, 'communication', 'tabs'),
       (1, 'communication', 'iphone'),
       (1, 'communication', 'smart phone'),
       (1, 'communication', 'others');
另一张桌子

CREATE TABLE [DBO].[TBL_FACILITY] 
(
    /* FACILITY TABLE */
     FACILITY_ID BIGINT IDENTITY(1, 1) NOT NULL
    ,FAMILY_HEAD_ID BIGINT NOT NULL
    ,FACILITY_SELECTED INT --- REF_NAME
    ,FACILITY_USED NVARCHAR(25) --- ref_value
    ,CONSTRAINT PK_FACILITY PRIMARY KEY (FACILITY_ID)
    )   

INSERT INTO TBL_FACILITY (FAMILY_HEAD_ID, FACILITY_SELECTED, FACILITY_USED) 
VALUES (121, 1, '2,6'), (122, 1, '5'), (123, 1, '5,6');
最终结果的格式:

121 communication laptop
121 communication smart phone
122 communication iphone
123 communication iphone
123 communication smart phone

如何获得此结果?

假设作为标识列,
tbl\u引用。ref\u number
列的值按向下顺序为1,2,3,4,5,6,7,通过
子字符串
CHARINDEX
字符串运算符的贡献,可以使用以下SQL:

SELECT family_head_id, ref_name+' '+ref_value reference
  FROM TBL_FACILITY INNER JOIN TBL_REFERENCE 
    ON ( ref_number = SUBSTRING(facility_used,CHARINDEX(',', facility_used)-1,1) )
UNION ALL
SELECT family_head_id, ref_name+' '+ref_value reference
  FROM TBL_FACILITY INNER JOIN TBL_REFERENCE 
    ON ( ref_number = SUBSTRING(facility_used,CHARINDEX(',', facility_used)+1,1) )
 ORDER BY 1, 2;

不应将多个值以逗号分隔存储在一列中。这是(a)违反了数据库设计的第一个标准形式,以及(b)一个非常糟糕的设计选择,因为它无法创建确保数据完整性的数据库级外键约束。您是否确定所有
tbl_reference.ref_number
列的值都是1或1,2,3,4,5,6,7作为标识列??如果有一个数据模型具有逗号分隔的值,您最好期望超过两个,例如,
'1,2,3,4'
:-)