[列名] IN ([検索リスト])という記述が多い。
しかし、検索値をIN句の前に持ってきて列名を列挙することもできる。
[検索値] IN ([列名リスト])
この用法は、類似する情報を複数のカラムで持つような場合に使える。
--最高音か最低音がC# 'C#' IN (top_note, bottom_note)あまり使いどころが無さそうに見えるが、正規化されていないテーブル設計を前にすると結構使えたり…。
[列名] IN ([検索リスト])という記述が多い。
[検索値] IN ([列名リスト])
--最高音か最低音がC# 'C#' IN (top_note, bottom_note)あまり使いどころが無さそうに見えるが、正規化されていないテーブル設計を前にすると結構使えたり…。
select * from -- 名称が10文字を超えるレコードの件数 (select '名称' as column_name ,count(*) as product_count from t_product p where p.color = 'red' -- 共通条件 and length(p.name) > 10 ) union all -- コードが4文字を超えるレコードの件数 (select 'コード' as column_name ,count(*) as product_count from t_product p where p.color = 'red' -- 共通条件 length(p.cd) > 4 ) -- 以下、似たような条件が続く...
select count(*) as 総数 ,sum(case when length(p.name) > 10 then 1 else 0 end) as 名称 ,sum(case when length(p.cd) > 4 then 1 else 0 end) as コード -- 以下、似たような条件が続く... from t_product p where p.color = 'red'
select
count(*) as 総数
,case when p.type = 'a' -- aの場合はnameのlengthだけで判断
then sum(case when length(p.name) > 10 then 1 else 0 end)
when p.type = 'b' -- bの場合はnameとcolorを結合したlengthで判断
then sum(case when length(p.name || p.color) > 15 then 1 else 0 end)
else -1 -- a,b以外のtypeの場合は集計対象外
end as 名称
,sum(case when length(p.cd) > 4 then 1 else 0 end) as コード
-- 以下、似たような条件が続く...
from
t_product p
where
p.color = 'red'
group by
p.type
order by
p.type
「カウントする=COUNT関数」しか頭になく…(以下略)
WHERE句で条件分岐させるのは素人のやること。プロはSELECT句で分岐させる。