2016-07-14 7 views
0

ANDORの倍数を持つクエリを実行しようとしています。クエリは次のとおりです。SQLの "AND"と "OR"ステートメント

SELECT 
COUNT(DISTINCT t.id) 
FROM tags t 
WHERE t.description LIKE '%Name%' 
AND t.description LIKE '%On-boarding%' 
OR t.description LIKE '%Pending Approval Inventory%' 
AND t.title = 'follow-up' 
AND t.created_at >= now() ::date; 

私は今日のレコードのみが必要です。問題は、!=今日の他の日付のレコードもカウントに含まれていることです。私はこの質問をどのようにデバッグするのかを決めることができません...どんな提案も大歓迎です。

+1

括弧 '()'を使用して、論理式をグループ化(および評価の順序を制御)します。また、今日は['EXPLAIN'](https://www.postgresql.org/docs/9.4/static/using-explain.html)について学ぶのに良い日です。 –

+0

[4.1.6。オペレータの優先順位](https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-PRECEDENCE) – klin

答えて

0

私はあなたがこれを望んでいると思う:

SELECT 
COUNT(DISTINCT t.id) 
FROM tags t 
WHERE ((t.description LIKE '%Name%' 
AND t.description LIKE '%On-boarding%') 
OR t.description LIKE '%Pending Approval Inventory%') 
AND t.title = 'follow-up' 
AND date_trunc('day', t.created_at) = date_trunc('day', now()); 

は、私はまた、あなたの説明フィルタの周りに括弧を追加しました。私はあなたが名前と一緒に搭乗することを望んでいるか、承認在庫が保留されていると思います。

しかし、実際のトリックは、date_trunc関数を使用することです。

0
SELECT 
COUNT(DISTINCT t.id) 
FROM tags t 
WHERE t.description LIKE '%Name%' 
AND (t.description LIKE '%On-boarding%' OR t.description LIKE %Pending Approval Inventory%') 
AND t.title = 'follow-up' 
AND CONVERT(DATE,t.created_at) = CONVERT(DATE,GETDATE()); 

ここで私はキャストするには日付関数ではT-SQLのビルドを使用している、あなたは、PostgreSQLの関数で、いくつかのビルドを使用する必要があるかもしれません。

+0

date_truncはPostgreSQLの組み込み関数で、タイムスタンプ/日付から精度を削除します。 Oracleが日付を処理する方法と非常によく似ています。 –