Как я возвращаю свои записи, сгруппированные ПУСТЫМ и NOT NULL?

Чтобы сделать это, я думаю, что у вас, вероятно, должна быть дополнительная таблица «ORDER», которая определяет сопоставление идентификаторов на заказ (эффективно делая то, что ответ на ваш собственный вопрос), которые затем можно использовать в качестве дополнительного столбца на ваш выбор, который вы затем можете сортировать.

Таким образом, вы явно описываете упорядочение, которое вы желаете в базе данных, где оно должно быть.

52
задан paxdiablo 9 August 2009 в 22:51
поделиться

12 ответов

Oracle:

группа nvl2 (поле, 'NOT NULL', 'ПУСТОЙ УКАЗАТЕЛЬ')

24
ответ дан trunkc 7 November 2019 в 09:06
поделиться

В количестве Oracle

SELECT COUNT(*), COUNT(TIME_STAMP_COLUMN)
FROM TABLE;

(*) возвращает количество всех строк

, количество (column_name) возвращает количество строк, которые не являются ПУСТЫМИ, таким образом

SELECT COUNT(*) - COUNT(TIME_STAMP_COLUMN) NUL_COUNT,
                  COUNT(TIME_STAMP_COLUMN) NON_NUL_COUNT
FROM TABLE

должен сделать задание.

, Если столбец индексируется, Вы могли бы закончить со своего рода диапазоном, сканируют и стараются не на самом деле читать таблицу.

0
ответ дан EvilTeach 7 November 2019 в 09:06
поделиться
Select Sum(Case When processed_timestamp IS NULL
                         Then 1
                         Else 0
                 End)                                                               not_processed_count,
          Sum(Case When processed_timestamp Is Not NULL
                         Then 1
                         Else 0
                 End)                                                               processed_count,
          Count(1)                                                                total
From table

Редактирование: не читал тщательно, эти возвраты единственная строка.

0
ответ дан Aleksey Otrubennikov 7 November 2019 в 09:06
поделиться

[T-SQL]:

select [case], count(*) tally
from (
  select 
  case when [processed_timestamp] is null then 'null'
  else 'not null'
  end [case]
  from myTable
) a 

И можно добавить в оператор выбора вообще другие значения, требуется сформировать раздел, например, сегодня, вчера, между полуднем и 14:00, после 18:00 в четверг.

0
ответ дан Unsliced 7 November 2019 в 09:06
поделиться

Мне лично нравится решение Мира, но если Вы абсолютно требуете только одной возвращенной строки (как я недавно имел), В SQL Server MS 2005/2008 Вы может "сложить" два запроса с помощью CTE

with NullRows (countOf)
AS
(
    SELECT count(*) 
    FORM table 
    WHERE [processed_timestamp] IS NOT NULL
)
SELECT count(*) AS nulls, countOf
FROM table, NullRows
WHERE [processed_timestamp] IS NULL
GROUP BY countOf

Hope, которому это помогает

0
ответ дан James Green 7 November 2019 в 09:06
поделиться

Если Ваша база данных имеет эффективное КОЛИЧЕСТВО (*) функция для таблицы, Вы могли бы РАССЧИТАТЬ, какой бы ни меньшее число, и вычесть.

1
ответ дан dkretz 7 November 2019 в 09:06
поделиться

Stewart,

, Возможно, рассматривают это решение. Это (также!) неопределенный поставщик.

SELECT count([processed_timestamp]) AS notnullrows, 
       count(*) - count([processed_timestamp]) AS nullrows 
FROM table

Что касается эффективности, это избегает 2x, индекс ищет/представляет сканирования/независимо от того, что в виде таблицы включением результатов на одной строке. Если Вы абсолютно требуете, чтобы 2 строки в результате, два передал по набору, может быть неизбежным из-за unioning, агрегируется.

Hope это помогает

5
ответ дан James Green 7 November 2019 в 09:06
поделиться

Если это - оракул тогда, можно сделать:

select decode(field,NULL,'NULL','NOT NULL'), count(*)
from table
group by decode(field,NULL,'NULL','NOT NULL');

я уверен, что другой DBS допускает подобный прием.

5
ответ дан ADEpt 7 November 2019 в 09:06
поделиться

Попробуйте следующее, это нейтрально в отношении поставщика:

select
    'null    ' as type,
    count(*)   as quant
    from       tbl
    where      tmstmp is null
union all
select
    'not null' as type,
    count(*)   as quant
    from       tbl
    where      tmstmp is not null

После наличия нашего локального гуру DB2 смотрят на это, он соглашается: ни одно из решений, представленных до настоящего времени (включая этого), не может избежать полного сканирования таблицы (таблицы, если метка времени не индексируется, или indexotherwise). Они все сканируют каждую запись в таблице точно однажды.

Весь CASE/IF/NVL2 () решения делают пустой указатель к преобразованию строк для каждой строки, представляя ненужную нагрузку на DBMS. Это решение не имеет той проблемы.

21
ответ дан paxdiablo 7 November 2019 в 09:06
поделиться

В T-SQL (SQL Server MS), это работает:

SELECT
  CASE WHEN Field IS NULL THEN 'NULL' ELSE 'NOT NULL' END FieldContent,
  COUNT(*) FieldCount
FROM
  TheTable
GROUP BY
  CASE WHEN Field IS NULL THEN 'NULL' ELSE 'NOT NULL' END
39
ответ дан Tomalak 7 November 2019 в 09:06
поделиться

В MySQL Вы могли сделать что-то как

SELECT 
    IF(ISNULL(processed_timestamp), 'NULL', 'NOT NULL') as myfield, 
    COUNT(*) 
FROM mytable 
GROUP BY myfield
43
ответ дан Stefan Gehrig 7 November 2019 в 09:06
поделиться

Другой метод MySQL должен использовать CASE оператор , который может быть обобщен к большему количеству альтернатив, чем IF():

SELECT CASE WHEN processed_timestamp IS NULL THEN 'NULL' 
            ELSE 'NOT NULL' END AS a,
       COUNT(*) AS n 
       FROM logs 
       GROUP BY a
2
ответ дан Tom 7 November 2019 в 09:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: