Duda con SQL

Hola !
Trabajando en un mini proyecto de la escuela me tope con una pequeña duda en SQL, les explicare mi duda con un ejemplo:
Supongamos que tengo una tabla con varios campos, ademas supongamos que esa tabla solo esta poblada por un registro, en la misma tabla hay 4 campos que admiten numeros enteros, mi pregunta es, puedo, mediante una consulta saber cuantos 5s o 6s tengo en el mismo registro?

tabla x
=================================
campo1 campo2 campo3 campo4 campo5
1________5________5______3_______6
=================================
Se supone que la consulta me arrojaria un 2, ya que solo hay dos numeros 5 en el registro. Hay alguna funcion en SQL que me permita hacer eso?
Esto?:

SELECT COUNT(*) FROM 'tabla_x' WHERE campo1 = '5' OR campo2 = '5' OR campo3 = '5' OR campo4 = '5' OR campo5 = '5'
DS_impact escribió:Esto?:

SELECT COUNT(*) FROM 'tabla_x' WHERE campo1 = '5' OR campo2 = '5' OR campo3 = '5' OR campo4 = '5' OR campo5 = '5'


Eso te dara como resultado 1, porque un registro (el unico que hay) cumple esa condicion. Select count cuenta filas, no columnas.

Sinceramente, ahora mismo no se si lo que se pide puede llevarse a cabo con SQL estandar.
Si se puede, pero has de crear una función antes:

Sacada de google:
CREATE FUNCTION [dbo].[fnCountChar] ( @pInput VARCHAR(max), @pSearchChar CHAR(1) )
RETURNS INT
BEGIN

DECLARE @vInputLength        INT
DECLARE @vIndex              INT
DECLARE @vCount              INT

SET @vCount = 0
SET @vIndex = 1
SET @vInputLength = DATALENGTH(@pInput)

WHILE @vIndex <= @vInputLength
BEGIN
    IF SUBSTRING(@pInput, @vIndex, 1) = @pSearchChar
        SET @vCount = @vCount + 1

    SET @vIndex = @vIndex + 1
END

RETURN @vCount

END

http://www.softcanon.com/?tag=/contar

entonces en el select si p.ej. es de 2 campos haces dbo.fncountchar(select concat(Campo1,campo2) from tabla,'caracter buscado')
O puedes crearte una función que solo haga esto especifico que tu quieres.
blackmasquerade escribió:
DS_impact escribió:Esto?:

SELECT COUNT(*) FROM 'tabla_x' WHERE campo1 = '5' OR campo2 = '5' OR campo3 = '5' OR campo4 = '5' OR campo5 = '5'


Eso te dara como resultado 1, porque un registro (el unico que hay) cumple esa condicion. Select count cuenta filas, no columnas.

Sinceramente, ahora mismo no se si lo que se pide puede llevarse a cabo con SQL estandar.


Es verdad que cuenta filas... como se nota que hace tiempo que no lo uso XD
Si quieres hacerlo sin funciones en plan sql "standard" podrias montar algo con UNION's y subconsultas

SELECT COUNT(*) AS total FROM (
SELECT 1 FROM TABLAX WHERE campo1 = 5
UNION
SELECT 1 FROM TABLAX WHERE campo2 = 5
UNION
SELECT 1 FROM TABLAX WHERE campo3 = 5
...
) TABLA_TMP

Ojo, porque tal cual esta ahi arriba, funciona para el ejemplo que dices, de una unica tupla (la subconsulta devuelve tantas tuplas de 1's como condiciones de campoxx == 5 se cumplan y luego las cuenta. Si tuvieras mas tuplas en la tabla, tendrias que decidir si te importa el que aparezca en varios campos o no para incluir condiciones AND a mayores en cada uno de los UNION's

Ahora mismo no me acuerdo muy bien de la sintaxis del UNION, si no te funciona y devuelve una unica, prueba con UNION ALL (creo que este ultimo no descartaba duplicados, y en mi consulta son duplicados, ya que cada SELECT del union devuelve un 1, si devolvieran 1, 2, 3 daria igual). Es probable que el UNION a secas haga el DISTINCT por defecto, pero ya digo, no me acuerdo, ademas tampoco especificas el SGDB que estas usando...
El SGBD que uso actualmente es MySQL, por cierto, alguien tendra algun ejemplo basico de funcion definida por el usuario?? encontre algunas en internet que se supone que son para MySQL pero me marca que tengo errores en la sintaxis.
6 respuestas