5

Varchar形式の列とDatetime値の列日付を持つデータベーステーブルmytableがあります。日付でグループ化された特定のパラメータを持つ名前を数えたいのですが。これが私がすることです:

SELECT
    CAST(t.date AS DATE) AS 'date',
    COUNT(*) AS total,
    SUM(LENGTH(LTRIM(RTRIM(t.name))) > 4 
        AND (LOWER(t.name) LIKE '%[a-z]%')) AS 'n'
FROM
    mytable t
GROUP BY 
    CAST(t.date AS DATE)

ここで範囲構文に問題があるようです。これを実行LIKE 'a%'すると、「a」で始まるすべてのフィールドが正しくカウントされます。ただし、上記のクエリはnに対して0を返しますが、少なくとも1文字を含むすべてのフィールドをカウントする必要があります。

4

4 に答える 4

8

あなたが書く:

ここで範囲構文に問題があるようです

確かにそうです。MySQLのLIKE演算子(および一般的にSQL)は、範囲表記をサポートせず、単純なワイルドカードをサポートします。

より完全な機能を備えたパターンマッチングのために、 MySQLの非標準のRLIKE(別名REGEXP)を試してください。

于 2012-09-27T01:07:18.167 に答える
5

LIKEは文字列の一部を検索するためだけのものだと思いますが、範囲を検索するために正規表現を実装したいようです。

その場合は、代わりにREGEXPを使用してください。例(簡略化):

SELECT * FROM mytable WHERE name REGEXP "[a-z]"

現在のクエリは、文字通り「[az]」の文字列を探しています。

更新しました:

SELECT
CAST(t.date AS DATE) AS 'date',
COUNT(*) AS total,
SUM(LENGTH(LTRIM(RTRIM(t.name))) > 4 
    AND (LOWER(t.name) REGEXP '%[a-z]%')) AS 'n'
FROM
mytable t
GROUP BY 
CAST(t.date AS DATE)
于 2012-09-27T01:07:55.657 に答える
2

LIKEステートメントに正規表現がありますが、これは機能しません。RLIKEまたはREGEXPを使用する必要があります。

SELECT CAST(t.date AS DATE) AS date,
    COUNT(*) AS total
FROM mytable AS t
WHERE t.name REGEXP '%[a-zA-Z]%' 
GROUP BY CAST(t.date AS DATE)
HAVING SUM(LENGTH(LTRIM(RTRIM(t.name))) > 4

また、参考までに、MySQLは文字列でひどいので、データベースに挿入する前に実際にトリミングする必要があります。そうすれば、選択するたびにクレイジーなオーバーヘッドが発生することはありません。

于 2012-09-27T01:11:39.887 に答える
2

LIKEの代わりにWHEREREGEXP'^[az]$'を使用したいと思います。

于 2012-09-27T01:07:12.167 に答える