use*_*915 7 sql sql-server sql-server-2008
我想创建一个Y/N标志,其中Y表示给定行中每列中的每个有效值相等,否则为N. 我需要排除任何包含空值,空格或全零的列.假设:
CREATE TABLE z_test
(ID INT NOT NULL,
D1 VARCHAR(8)NULL,
D2 VARCHAR(8)NULL,
D3 VARCHAR(8)NULL,
D4 VARCHAR(8)NULL,
DFLAG CHAR(1)NULL)
INSERT INTO z_test VALUES (1,NULL,' ','000000','00000000',NULL)
INSERT INTO z_test VALUES (1,'20120101','0000','20120101','00000000',NULL)
INSERT INTO z_test VALUES (2,'20100101','20100101','20100101','20100101',NULL)
INSERT INTO z_test VALUES (2,'00000000','20090101','0','20090101',NULL)
INSERT INTO z_test VALUES (3,'00000000','20090101',NULL,'20120101',NULL)
INSERT INTO z_test VALUES (3,'20100101',' ',NULL,'20100101',NULL)
Run Code Online (Sandbox Code Playgroud)
所需的输出(不包括D1到D4,但我不想丢弃它们)是:
ID DFLAG
---------------
1 N
1 Y
2 Y
2 Y
3 N
3 Y
Run Code Online (Sandbox Code Playgroud)
速度不是一个问题,因为这个查询不会经常运行,但它在一个较大的表上.
任何指针或建议将非常感谢!!
SELECT ID,
CASE
WHEN C = 1 THEN 'Y'
ELSE 'N'
END AS DFLAG
FROM z_test
CROSS APPLY (SELECT COUNT(DISTINCT D) C
FROM (VALUES(D1),
(D2),
(D3),
(D4)) V(D)
WHERE LEN(D) > 0 /*Excludes blanks and NULLs*/
AND D LIKE '%[^0]%'/*Excludes ones with only zero*/) CA
Run Code Online (Sandbox Code Playgroud)
这有效:
select case when
(D1 is null OR D2 is null OR LEN(REPLACE(D1,'0',''))=0 OR LEN(REPLACE(D2,'0',''))=0 OR D1=D2)
AND (D1 is null OR D3 is null OR LEN(REPLACE(D1,'0',''))=0 OR LEN(REPLACE(D3,'0',''))=0 OR D1=D3)
AND (D1 is null OR D4 is null OR LEN(REPLACE(D1,'0',''))=0 OR LEN(REPLACE(D4,'0',''))=0 OR D1=D4)
AND (D2 is null OR D3 is null OR LEN(REPLACE(D2,'0',''))=0 OR LEN(REPLACE(D3,'0',''))=0 OR D2=D3)
AND (D2 is null OR D4 is null OR LEN(REPLACE(D2,'0',''))=0 OR LEN(REPLACE(D4,'0',''))=0 OR D2=D4)
AND (D3 is null OR D4 is null OR LEN(REPLACE(D3,'0',''))=0 OR LEN(REPLACE(D4,'0',''))=0 OR D3=D4)
AND (LEN(REPLACE(D1,'0','')) > 0
OR LEN(REPLACE(D2,'0','')) > 0
OR LEN(REPLACE(D3,'0','')) > 0
OR LEN(REPLACE(D4,'0','')) > 0)
THEN 'Y' ELSE 'N' END
from z_test
Run Code Online (Sandbox Code Playgroud)
这是sqlfiddle 的链接.