[SQL] SQL의 행에 널 열 카운트
SQLSQL의 행에 널 열 카운트
내가 SQL에서 행의 널 열을 계산 할 수있는 가능성에 대해 궁금 해서요, 내가 널 (NULL) 값이있는 테이블 고객이 단순히 내가 특정 행 (특정 고객)에 대한 널 열 수의 int를 반환하는 쿼리를 원한다.
해결법
-
==============================
1.이 메소드는 null 컬럼에 대한 1 또는 0을 할당하고, 그들에게 모두 함께를 추가합니다. 희망 당신은 여기에 추가하는 너무 많은 널 (NULL) 컬럼이없는 ...
이 메소드는 null 컬럼에 대한 1 또는 0을 할당하고, 그들에게 모두 함께를 추가합니다. 희망 당신은 여기에 추가하는 너무 많은 널 (NULL) 컬럼이없는 ...
SELECT ((CASE WHEN col1 IS NULL THEN 1 ELSE 0 END) + (CASE WHEN col2 IS NULL THEN 1 ELSE 0 END) + (CASE WHEN col3 IS NULL THEN 1 ELSE 0 END) ... ... + (CASE WHEN col10 IS NULL THEN 1 ELSE 0 END)) AS sum_of_nulls FROM table WHERE Customer=some_cust_id
당신의 RDBMS 지원을하는 경우 참고, 당신은 또한 IF ()보다 문법적으로 깔끔하게이 아마 조금 할 수 있습니다.
SELECT (IF(col1 IS NULL, 1, 0) + IF(col2 IS NULL, 1, 0) + IF(col3 IS NULL, 1, 0) ... ... + IF(col10 IS NULL, 1, 0)) AS sum_of_nulls FROM table WHERE Customer=some_cust_id
나는 테이블에 대해이 패턴을 테스트하고 제대로 작동하려면 나타납니다.
-
==============================
2.내 대답은 마이클 Berkowski의 대답을 기반으로하지만, 피하기는 열 이름의 수백을 입력하는 데, 제가 한 일은이 있었다 :
내 대답은 마이클 Berkowski의 대답을 기반으로하지만, 피하기는 열 이름의 수백을 입력하는 데, 제가 한 일은이 있었다 :
1 단계 : 테이블의 모든 컬럼의 목록을 가져옵니다
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'myTable';
2 단계 : ++ 메모장에서 목록을 붙여 넣기 (지원 정규 표현식 교체 작동합니다 어떤 편집기). 그런 다음이 교체 패턴을 사용
3 단계 : 앞에 추가 SELECT identityColumnName, 그리고에 의해 주문을 추가 선택적 myTable에 FROM AS NullCount에 맨 마지막 +을 변경하고 ...
SELECT identityColumnName, (CASE WHEN column001 IS NULL THEN 1 ELSE 0 END) + -- ... (CASE WHEN column200 IS NULL THEN 1 ELSE 0 END) AS NullCount FROM myTable ORDER BY NullCount DESC
-
==============================
3.오라클 DBMS에만 해당됩니다.
오라클 DBMS에만 해당됩니다.
당신은 NVL2 기능을 사용할 수 있습니다 :
NVL2( string1, value_if_not_null, value_if_null )
여기에 마이클 Berkowski 제안으로 비슷한 접근 방식을 선택할 수 있습니다 :
SELECT (NVL2(col1, 0, 1) + NVL2(col2, 0, 1) + NVL2(col3, 0, 1) ... ... + NVL2(col10, 0, 1) ) AS sum_of_nulls FROM table WHERE Customer=some_cust_id
보다 일반적인 방법은 PL / SQL 블록 사용 동적 SQL을 작성하는 것입니다. 당신은 특정 테이블의 ALL_TAB_COLUMNS의 모든 컬럼에 대한 위의 NVL2 방법과 SELECT 문자열을 구축해야합니다.
-
==============================
4.불행하게도, 표준 SQL 문에 모든 프로그래밍 방식은 T-SQL을 사용할 수 있습니다 테스트, 테스트 할 각 열을 입력해야합니다. 그러나 경고의 말씀이, 데이터베이스 진정한 NULL로 인식되지 않습니다 빈 저장된 값을 가질 수 있습니다, 당신은 진정한 null로 작동하고 있는지 (I 이상한이 소리를 알고있다).
불행하게도, 표준 SQL 문에 모든 프로그래밍 방식은 T-SQL을 사용할 수 있습니다 테스트, 테스트 할 각 열을 입력해야합니다. 그러나 경고의 말씀이, 데이터베이스 진정한 NULL로 인식되지 않습니다 빈 저장된 값을 가질 수 있습니다, 당신은 진정한 null로 작동하고 있는지 (I 이상한이 소리를 알고있다).
이 같은 성명에서 빈 값과 NULLS를 캡처하여이를 방지 할 수 있습니다 :
CASE WHEN col1 & '' = '' THEN 1 ELSE 0 END
또는 Oracle과 같은 일부 데이터베이스의 (하지 않도록 어떤 다른 사람이있는 경우)를 사용하는 것입니다 :
CASE WHEN col1 || '' = '' THEN 1 ELSE 0 END
-
==============================
5.당신은 RDBMS를 명시하지 않습니다. SQL Server 2008의 ...
당신은 RDBMS를 명시하지 않습니다. SQL Server 2008의 ...
SELECT CustomerId, (SELECT COUNT(*) - COUNT(C) FROM (VALUES(CAST(Col1 AS SQL_VARIANT)), (Col2), /*....*/ (Col9), (Col10)) T(C)) AS NumberOfNulls FROM Customer
-
==============================
6.수행하려는 작업에 따라, 당신은 달인을 무시한다면, 당신은 2012 SQL 서버를 사용하는 경우, 당신은 다른 방법으로 그것을 할 수 있었다. .
수행하려는 작업에 따라, 당신은 달인을 무시한다면, 당신은 2012 SQL 서버를 사용하는 경우, 당신은 다른 방법으로 그것을 할 수 있었다. .
후보 컬럼의 총 수는 ( "슬롯")를 알고 있어야합니다. 열을 기준으로 모든 알려진 "슬롯"열을 선택합니다 (그들은 알려진 것). 를 얻기 위해 결과 2. 피벗 해제 원본 항목 당 하나의 행 테이블. 널 열이 없기 때문에이 작품 UNPIVOT, 당신은 모두에게 열 이름을 알고있다. 3. 카운트 (*) 비 - 널의 수를 얻을 수있는 결과; 답을 얻기 위해 그에서 뺍니다.
이와 같이, 자동차 4 "석"에 대한
select 'empty seats' = 4 - count(*) from ( select carId, seat1,seat2,seat3,seat4 from cars where carId = @carId ) carSpec unpivot (FieldValue FOR seat in ([seat1],[seat2],[seat3],[seat4])) AS results
단지 null이 아닌 컬럼의 수를 세는 것보다 당신에게 너무 세트로 열을 조작 할 수있는 방법을 제공합니다 당신이 더 이상 수행해야 할 수 있습니다 경우에 유용합니다.
-
==============================
7.이렇게하면 널 (null)가 아닌 컬럼의 수를 줄 것이다. 당신은 적절하게이 문제를 적용 할 수 있습니다
이렇게하면 널 (null)가 아닌 컬럼의 수를 줄 것이다. 당신은 적절하게이 문제를 적용 할 수 있습니다
SELECT ISNULL(COUNT(col1),'') + ISNULL(COUNT(col2),'') +ISNULL(COUNT(col3),'') FROM TABLENAME WHERE ID=1
-
==============================
8.스크립트 아래는 행 즉, 값이없는 얼마나 많은 열을 내 당신에게 NULL 값의 수를 제공합니다.
스크립트 아래는 행 즉, 값이없는 얼마나 많은 열을 내 당신에게 NULL 값의 수를 제공합니다.
{SELECT *, (SELECT COUNT(*) FROM (VALUES (Tab.Col1) ,(Tab.Col2) ,(Tab.Col3) ,(Tab.Col4)) InnerTab(Col) WHERE Col IS NULL) NullColumnCount FROM (VALUES(1,2,3,4) ,(NULL,2,NULL,4) ,(1,NULL,NULL,NULL)) Tab(Col1,Col2,Col3,Col4) }
그냥 내 예제에서 인라인 테이블을 사용하고 설명합니다.
캐스트로 시도하거나 당신이 다른 유형의 열을 비교하는 데 도움이 될 것입니다 일반적인 유형에 모든 열 값을 변환합니다.
-
==============================
9.나는 아직 테스트하지 않은,하지만 난 PL \ SQL 함수를 사용하여 수행하려고 할 것
나는 아직 테스트하지 않은,하지만 난 PL \ SQL 함수를 사용하여 수행하려고 할 것
CREATE OR REPLACE TYPE ANYARRAY AS TABLE OF ANYDATA ; CREATE OR REPLACE Function COUNT_NULL ( ARR IN ANYARRAY ) RETURN number IS cnumber number ; BEGIN for i in 1 .. ARR.count loop if ARR(i).column_value is null then cnumber := cnumber + 1; end if; end loop; RETURN cnumber; EXCEPTION WHEN OTHERS THEN raise_application_error (-20001,'An error was encountered - ' ||SQLCODE||' -ERROR- '||SQLERRM); END ;
다음과 같은 선택 쿼리에서 사용
CREATE TABLE TEST (A NUMBER, B NUMBER, C NUMBER); INSERT INTO TEST (NULL,NULL,NULL); INSERT INTO TEST (1 ,NULL,NULL); INSERT INTO TEST (1 ,2 ,NULL); INSERT INTO TEST (1 ,2 ,3 ); SELECT ROWNUM,COUNT_NULL(A,B,C) AS NULL_COUNT FROM TEST;
예상 출력
ROWNUM | NULL_COUNT -------+----------- 1 | 3 2 | 2 3 | 1 4 | 0
-
==============================
10.이것은 내가 시도하는 방법이다
이것은 내가 시도하는 방법이다
CREATE TABLE #temptablelocal (id int NOT NULL, column1 varchar(10) NULL, column2 varchar(10) NULL, column3 varchar(10) NULL, column4 varchar(10) NULL, column5 varchar(10) NULL, column6 varchar(10) NULL); INSERT INTO #temptablelocal VALUES (1, NULL, 'a', NULL, 'b', NULL, 'c') SELECT * FROM #temptablelocal WHERE id =1 SELECT count(1) countnull FROM (SELECT a.ID, b.column_title, column_val = CASE b.column_title WHEN 'column1' THEN a.column1 WHEN 'column2' THEN a.column2 WHEN 'column3' THEN a.column3 WHEN 'column4' THEN a.column4 WHEN 'column5' THEN a.column5 WHEN 'column6' THEN a.column6 END FROM ( SELECT id, column1, column2, column3, column4, column5, column6 FROM #temptablelocal WHERE id =1 ) a CROSS JOIN ( SELECT 'column1' UNION ALL SELECT 'column2' UNION ALL SELECT 'column3' UNION ALL SELECT 'column4' UNION ALL SELECT 'column5' UNION ALL SELECT 'column6' ) b (column_title) ) AS pop WHERE column_val IS NULL DROP TABLE #temptablelocal
-
==============================
11.유사하지만, 동적 :
유사하지만, 동적 :
drop table if exists myschema.table_with_nulls; create table myschema.table_with_nulls as select n1::integer, n2::integer, n3::integer, n4::integer, c1::character varying, c2::character varying, c3::character varying, c4::character varying from ( values (1,2,3,4,'a','b','c','d'), (1,2,3,null,'a','b','c',null), (1,2,null,null,'a','b',null,null), (1,null,null,null,'a',null,null,null) ) as test_records(n1, n2, n3, n4, c1, c2, c3, c4); drop function if exists myschema.count_nulls(varchar,varchar); create function myschema.count_nulls(schemaname varchar, tablename varchar) returns void as $BODY$ declare calc varchar; sqlstring varchar; begin select array_to_string(array_agg('(' || trim(column_name) || ' is null)::integer'),' + ') into calc from information_schema.columns where table_schema in ('myschema') and table_name in ('table_with_nulls'); sqlstring = 'create temp view count_nulls as select *, ' || calc || '::integer as count_nulls from myschema.table_with_nulls'; execute sqlstring; return; end; $BODY$ LANGUAGE plpgsql STRICT; select * from myschema.count_nulls('myschema'::varchar,'table_with_nulls'::varchar); select * from count_nulls;
나는 기능을 parametising 완료되지 않은 것을 볼 수 있지만.
-
==============================
12.내 대답은 드류 채핀의 대답에,하지만 피할 단계 과정을 할 필요 단지 하나의 쿼리 실행에 빌드 :
내 대답은 드류 채핀의 대답에,하지만 피할 단계 과정을 할 필요 단지 하나의 쿼리 실행에 빌드 :
use <add_database_here>; Declare @val Varchar(MAX); Select @val = COALESCE(@val + str, str) From (SELECT '(CASE WHEN '+COLUMN_NAME+' IS NULL THEN 1 ELSE 0 END) +' str FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<add table name here>' ) t1 -- getting column names and adding the case when to replace NULLs for zeros or ones Select @val = SUBSTRING(@val,1,LEN(@val) - 1) -- removing trailling add sign Select @val = 'SELECT <add_identity_column_here>, ' + @val + ' AS NullCount FROM <add table name here>' -- adding the 'select' for the column identity, the 'alias' for the null count column, and the 'from' EXEC (@val) --executing the resulting sql
-
==============================
13.계산 행에있을 것 같은 일을하는 간단한 방법이 없습니다. 기본적으로, 당신은 하나 개의 표현에 널 (null)이 될 수있는 모든 열을 열거합니다.
계산 행에있을 것 같은 일을하는 간단한 방법이 없습니다. 기본적으로, 당신은 하나 개의 표현에 널 (null)이 될 수있는 모든 열을 열거합니다.
null의 가능성이있는 열이있는 테이블에 대한 그래서 A, B는 C, 당신은이 작업을 수행 할 수 있습니다 :
SELECT key_column, COALESCE(a,0) + COALESCE(b,0) + COALESCE(c,0) null_col_count FROM my_table
from https://stackoverflow.com/questions/8596500/count-the-null-columns-in-a-row-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 저장 프로 시저를 사용하여 대량 삽입 (0) | 2020.05.22 |
---|---|
[SQL] SQL : 어떻게 하나의 열에서 여러 기준을 충족하는 하나의 아이디 ( "행")를 선택합니다 (0) | 2020.05.22 |
[SQL] 어떻게 MySQL의에서 JSON 데이터를 검색하려면? (0) | 2020.05.22 |
[SQL] 왜 DBMS의 지원 주장을 할 (0) | 2020.05.22 |
[SQL] MySQL은 삽입 / 업데이트 임의 날짜 (0) | 2020.05.22 |