1
+------+
| num  |
+------+
|    1 |
|    2 |
|    3 |
| NULL |
|    5 |
|    6 |
+------+

テーブルテストです。

select max(num) from test;   ---> 6

NULL 値が存在する場合 --> 出力が "OK" になる SQL ステートメントの記述方法

この列に NULL 値が存在しない場合 --> 出力は 6 になります

何度も試してみますが、うまくいきません。何か助けはありますか?解決策が ANSI SQL であればいいのですが

4

7 に答える 7

3

これを試してください:http://www.sqlfiddle.com/#!2/dfcbd/2

これ:

CREATE TABLE tbl
    (`num` int);

INSERT INTO tbl
    (`num`)
VALUES
    (1),
    (2),
    (3),
    (NULL),
    (5),
    (6);

select if(bit_or(num is null), 'OK', max(num)) as max from tbl;

出力:

OK

これ:

CREATE TABLE tblx
    (`num` int);

INSERT INTO tblx
    (`num`)
VALUES
    (1),
    (2),
    (3),    
    (5),
    (6);

select if(bit_or(num is null), 'OK', max(num)) as max from tblx;

出力:

6
于 2012-06-14T06:26:04.450 に答える
2

以下のANSISQLhttp: //www.sqlfiddle.com/#!1/679b2/1

ほとんどのデータベースにはファーストクラスのブール型がないため、クエリは長くなります。そして多くのデータベースは、整数をvarcharに暗黙的に変換しないでください

select

  case when count(case when num is null then 1 end) > 0 then 
     'OK' 
  else
     cast(max(num) as varchar(16))
  end

from tbl

すべてのデータベースにファーストクラスのブール値がある場合、上記は次のように短縮できます。

select

  case when sum(cast( (num is null) as int )) > 0 then 
    'OK' 
  else
    cast(max(num) as varchar(16))
  end

from tbl

ただし、すべてのデータベースに実際にファーストクラスのブール値がある場合は、bool_or / bit_orも作成され、より短くなります:http ://www.sqlfiddle.com/#!1/679b2/6

select

  case when bool_or( num is null )  then 
    'OK' 
  else
    cast(max(num) as varchar(16))
  end

from tbl;
于 2012-06-14T06:57:54.120 に答える
1

null値を割引するためCOUNT(column)、次を使用できます。

SELECT CASE WHEN COUNT(*) = COUNT(num) THEN MAX(num) ELSE "OK" END
  FROM Test;

私が使用するDBMS(Informix)では、THENとELSEの型が同じである必要があるため、テストを行いました。

SELECT CASE WHEN COUNT(*) = COUNT(num) THEN CAST(MAX(num) AS CHAR(10)) ELSE "OK" END
  FROM Test;

これは、キャストの冗長な方法の1つです(ただし、標準SQLです)。多くの場合、特定のDBMSで使用可能な省略形があります。

出力例:

+ CREATE TABLE Test(Num INTEGER);
+ INSERT INTO Test VALUES(1);
+ INSERT INTO Test VALUES(2);
+ INSERT INTO Test VALUES(3);
+ INSERT INTO Test VALUES(NULL);
+ INSERT INTO Test VALUES(5);
+ INSERT INTO Test VALUES(6);
+ SELECT CASE WHEN COUNT(*) = COUNT(num) THEN CAST(MAX(num) AS CHAR(10)) ELSE "OK" END
  FROM Test;
OK
+ DELETE FROM Test WHERE Num IS NULL;
+ SELECT CASE WHEN COUNT(*) = COUNT(num) THEN CAST(MAX(num) AS CHAR(10)) ELSE "OK" END
  FROM Test;
6
于 2012-06-14T06:18:24.970 に答える
0

これを試して

select 
    case when ( select COUNT(*) from tableName where num is null ) > 0 then 'OK'
    else CONVERT(varchar, MAX(num) ) end as [num]
from tableName
于 2012-06-14T06:17:12.577 に答える
0

私のSQLでは

Select (Case When hasNull > 0 Then 'OK' Else mx End) As Result
From
(
  Select Max(num) as mx,Sum(Case When numIs Null Then 1 Else 0 End) as hasNull 
  From test 
) as t
于 2012-06-14T06:10:55.933 に答える
0

これを試して..

   select CASE num when num is null then "OK" else max(num) END from test; 
于 2012-06-14T06:12:14.903 に答える
0

NULL2 つのクエリ (1 つは値のテスト用、もう 1 つは計算用) の実行を避けたい場合は、次のように (SQL Server 構文) のように、値の有無にかかわらず、 と をmax使用count(*)count(num)て値の数をカウントできます。NULL

with TestQ as
(
   select max(num) as MaxNum, count(num) as NumCountNotNull, count(*) as NumCountTotal from nullAggTest
)
select 
   SpecialMax = case
      when NumCountNotNull < NumCountTotal then -1
      else MaxNum
   end
from TestQ

簡単にするために、特別な値OKをに置き換えたことに注意してください。-1

于 2012-06-14T06:25:19.453 に答える